{"owner":"pbek","repo":"QOwnNotes","hasSkills":true,"totalSkillsCount":3,"totalTokensCount":6015,"categories":["anthropic-skill","root-instruction","copilot-instructions"],"hasMcp":false,"mcpConfig":null,"found":[".opencode/skills/crowdin-translations/SKILL.md","AGENTS.md",".github/copilot-instructions.md"],"skills":{".opencode/skills/crowdin-translations/SKILL.md":"---\nname: Crowdin Translations\ndescription: Translate missing QOwnNotes application strings directly in Crowdin for German, Simplified Chinese, Russian, Italian, Brazilian Portuguese, Polish, French, and Spanish while preserving existing translations.\n---\n\n# Crowdin translations\n\nUse this skill to fill missing application translations in the QOwnNotes Crowdin\nproject. Creating or updating this skill alone does not authorize submitting\ntranslations. Respect Plan mode and obtain authorization before remote writes\nwhen the user's request does not already authorize them.\n\n## Default languages and scope\n\nUnless the user selects a subset, use all eight languages:\n\n| Requested locale | Crowdin language ID | Local application catalog          |\n| ---------------- | ------------------- | ---------------------------------- |\n| `de_DE`          | `de`                | `src/languages/QOwnNotes_de.ts`    |\n| `zh_CN`          | `zh-CN`             | `src/languages/QOwnNotes_zh_CN.ts` |\n| `ru_RU`          | `ru`                | `src/languages/QOwnNotes_ru.ts`    |\n| `it_IT`          | `it`                | `src/languages/QOwnNotes_it.ts`    |\n| `pt_BR`          | `pt-BR`             | `src/languages/QOwnNotes_pt_BR.ts` |\n| `pl_PL`          | `pl`                | `src/languages/QOwnNotes_pl.ts`    |\n| `fr_FR`          | `fr`                | `src/languages/QOwnNotes_fr.ts`    |\n| `es_ES`          | `es-ES`             | `src/languages/QOwnNotes_es.ts`    |\n\nConfirm language IDs against the live project. Read `crowdin.yaml` for the project\nID and file mapping rather than assuming they never change. The application\nsource is currently `src/languages/QOwnNotes_en.ts`, mapped to `/QOwnNotes_en.ts`\nin Crowdin. Do not confuse it with website Markdown or browser-extension files.\n\nDefault to application strings only. Do not expand to the website, change source\nstrings, download translations into the repository, update release files, or\ncommit changes unless requested. Keep temporary scripts, snapshots, and reports\nin a unique task directory under `/tmp/opencode`.\n\n## Safety rules\n\n- Fill missing translations and missing plural categories only. Preserve all\n  existing suggestions, effective translations, and approvals, even if they have\n  QA warnings. Fixing existing translations is a separate task.\n- Submit new translations without approving them. Do not reset approvals, vote,\n  or mark QA warnings resolved just to obtain a clean report.\n- Do not invoke paid MT or AI engines without explicit authorization. Translate\n  strings yourself; free reuse of existing project wording is preferable.\n- Use the installed CLI's credential resolution. Credentials may be in\n  `~/.crowdin.yaml` or the environment. Never print credentials, include tokens\n  in command arguments, or write them into the repository, reports, or skill.\n  When API calls are necessary, load credentials privately into process memory\n  and use an Authorization header. Redact sensitive errors.\n- Never use generic `crowdin upload` or `just translations-upload` for this task:\n  they upload source files, not just the missing translations.\n\n## Workflow\n\n### 1. Discover live gaps\n\n1. Read repository instructions and `crowdin.yaml`; check `git status --short`.\n2. Check `crowdin --help` and relevant subcommand help for the installed version.\n   Verify access with `crowdin status --no-progress --no-colors`.\n3. Resolve the application file ID and requested languages using the live API.\n   Fetch source strings, including their context, identifiers, and plural data.\n4. Snapshot existing translations and approvals as needed for preservation\n   checks. Local `.ts` files can provide context, but they may be stale and their\n   unfinished counts are not authoritative Crowdin counts.\n5. Paginate API collections completely. A typical page size is 500; honor the\n   endpoint's actual limits. Keep a resumable submission log.\n\nUseful API v2 paths, relative to `https://api.crowdin.com/api/v2`:\n\n```text\nGET /projects/{projectId}\nGET /projects/{projectId}/files\nGET /projects/{projectId}/strings?fileId={fileId}\nGET /projects/{projectId}/languages/{languageId}/translations?fileId={fileId}\nGET /projects/{projectId}/translations?stringId={stringId}&languageId={languageId}\nGET /projects/{projectId}/files/{fileId}/languages/progress\n```\n\nThe language-translations endpoint returns plain `text` or a `plurals` array.\nIt can omit incompletely translated plural strings entirely. An absent entry\ntherefore does **not** prove that a string has no existing suggestions. Query\nthe string-translations endpoint before writing; for plurals, check each\n`pluralCategoryName` separately and preserve the categories already present.\nSkip hidden source strings unless explicitly requested.\n\n### 2. Reuse established translations\n\nIf authorized to write, first try perfect translation-memory matches for missing\napplication strings only. For the current CLI, the command is:\n\n```sh\ncrowdin pre-translate --method=tm --file=/QOwnNotes_en.ts \\\n  -l de -l zh-CN -l ru -l it -l pt-BR -l pl -l fr -l es-ES \\\n  --translate-untranslated-only --translate-with-perfect-match-only \\\n  --no-duplicate-translations --no-progress --no-colors\n```\n\nAdjust the languages and file path to the requested scope. Leave auto-approval\nunset. Refresh gaps afterward. Never assume that a successful TM job filled all\ngaps or that fuzzy matches are acceptable without review.\n\nAn existing translation of exactly the same source text can be reused if the\ncontexts have the same meaning and there are no conflicting translations. Do\nnot propagate ambiguous short labels blindly. Check the glossary and surrounding\nUI wording before writing new translations.\n\n### 3. Translate and validate\n\nWork in manageable batches and use source contexts and application code to\nresolve ambiguities. Preserve product names, commands, protocol names, and\nliteral examples unless localization is appropriate. Numeric bookmark slots can\nshare a reviewed translation template when only the slot number changes.\n\nBefore submission, check:\n\n- Qt placeholders, including `%1`, `%2`, `%L1`, `%n`, `%Ln`, `%v`, and `%m`.\n  Preserve their identities and multiplicity; allow grammatical reordering.\n- HTML tags, attributes, URLs, Markdown links, command-line flags, and constants\n  such as `QOWNNOTESAPI_MIN_VERSION`.\n- Meaningful line breaks, leading/trailing spaces used for concatenation, and\n  Qt `&` keyboard accelerators. Accelerators can move to a suitable letter.\n- Natural punctuation and ellipses for each locale. Chinese UI strings may need\n  `。` and `……` rather than English punctuation.\n- All plural categories required by the live language metadata, not merely the\n  categories present in the English source. In particular, Russian and Polish\n  also require `few` and `many`; preserve an existing `other` category as well.\n  Read `pluralCategoryNames` instead of hardcoding a universal category list.\n- Correct singular, plural, gender, and case. Do not copy English `(s)` notation\n  into natural translated plural forms or remove `%n` from singular forms.\n\n### 4. Submit missing entries only\n\nPrefer the CLI where it supports the operation safely. For individual missing\nstrings, the API avoids uploading whole catalogs or unrelated files:\n\n```text\nPOST /projects/{projectId}/translations\n{\n  \"stringId\": 123,\n  \"languageId\": \"fr\",\n  \"text\": \"...\",\n  \"pluralCategoryName\": \"one\"\n}\n```\n\nOmit `pluralCategoryName` for nonplural strings. Immediately before posting,\nrecheck existing suggestions for that string/language/category. Skip entries\nsomeone else has translated in the meantime. Do not approve the result.\n\nUse bounded concurrency, respect rate limits, and retry transient failures with\nbackoff. After an ambiguous POST failure, recheck whether the translation was\ncreated before retrying. Log language, string ID, plural category, submitted text,\nand returned translation ID. Resume from that log instead of duplicating work.\nDo not run overlapping upload batches for the same string/language/category.\n\nCrowdin's individual translation endpoint does not support editing text with a\nJSON Patch request. If one of **this task's own new submissions** needs correction,\nverify its ID and unchanged text, add the corrected suggestion, then remove only\nthat exact task-created suggestion. Log the replacement ID. Never delete a\npre-existing or externally edited translation.\n\n### 5. Verify and report\n\n1. Wait for all submitted batches to finish, then refetch effective translations\n   and application-file language progress.\n2. Verify that every active source string has all required translated categories,\n   all submitted placeholders remain valid, and pre-existing translations and\n   approvals are unchanged. Recheck partial plural strings explicitly.\n3. Review Crowdin QA warnings for the new translation IDs/categories. Product\n   names, German compounds, Chinese accelerator notation, and omitted English\n   `(s)` notation can cause false positives. Glossary checks may also mistake\n   parts of compounds or confuse a tab character with a UI tab. Fix real issues,\n   but do not distort valid translations or dismiss existing warnings.\n4. Confirm repository files remain unchanged unless changes were requested.\n5. Report live application-file completion for each language, any remaining gaps\n   or blockers, and that new entries await review. Do not equate \"100% translated\"\n   with \"100% approved\" or imply the website was translated.\n","AGENTS.md":"# QOwnNotes - Agents Instructions\n\n## Project Overview\n\nQOwnNotes is an open source notepad with Markdown support and todo list manager for GNU/Linux, macOS, and Windows. It works together with Nextcloud Notes and ownCloud Notes.\n\n- **Language**: C++\n- **Framework**: Qt (supports both Qt5 and Qt6)\n- **Build Systems**:\n  - **qmake** (`.pro` files) - Primary build system\n  - **CMake** (`CMakeLists.txt`) - Alternative build system\n- **Task Runner**: just (justfile)\n\n## Building the Application\n\n### Quick Build (Recommended for Development)\n\nUse the `just` task runner to build the application:\n\n```bash\njust src-build\n```\n\nThis command will:\n\n1. Check qmake version\n2. Create the `build-QOwnNotes` directory\n3. Run qmake with debug configuration and system Botan\n4. Build using all available CPU cores with `make -j$(nproc)`\n\n### Alternative Build Commands\n\n- **Run tests**: `just src-test` (or `just test`)\n- **Clean build directory**: `just src-clean`\n- **Build and run**: `just src-build-run`\n- **Run built application**: `just src-run`\n\n### Building with Nix\n\nFor Nix users, multiple build options are available:\n\n- **Qt5 build**: `just nix-build-qt5`\n- **Qt6 with KDE integration (Linux)**: `just build` or `just nix-build`\n- **Plain Qt6 build**: `just nix-build-qt6`\n- **Force rebuild**: `just nix-build-force`\n\n### Manual Build with CMake\n\nAlternatively, use CMake for building:\n\n```bash\nmkdir build && cd build\n\n# Configure with Qt6\ncmake ../src -DQON_QT6_BUILD=ON -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Or with Qt5 (default)\ncmake ../src -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Build\nmake -j4\n```\n\n**Available CMake Options:**\n\n- `QON_QT6_BUILD=ON` - Build with Qt6 (default: OFF, uses Qt5)\n- `QON_KDE_INTEGRATION=ON` - Optional KDE Frameworks 6 integration (default: OFF,\n  Linux and Qt6 only; requires Extra CMake Modules, KColorScheme, KCoreAddons, KCrash, KGlobalAccel, KNotifications, KWindowSystem, Purpose, and PlasmaActivities)\n- `DEV_MODE=ON` - Enable developer mode with extra warnings\n- `BUILD_WITH_LIBGIT2=ON` - Use system libgit2 library\n- `BUILD_WITH_ASPELL=ON` - Enable aspell spell checking support\n- `USE_QLITEHTML=ON` - Use QLiteHtml for preview\n- `CMAKE_BUILD_TYPE=Debug|Release` - Build type\n\nExample with multiple options:\n\n```bash\ncmake ../src \\\n  -DQON_QT6_BUILD=ON \\\n  -DDEV_MODE=ON \\\n  -DBUILD_WITH_LIBGIT2=ON \\\n  -DBUILD_WITH_ASPELL=ON \\\n  -DCMAKE_BUILD_TYPE=Debug\n```\n\n## Project Structure\n\nFor the KDE integration roadmap and build instructions, see `docs/kde-integration.md`.\n`just src-build-kde` provides a CMake development recipe in a KDE-enabled environment;\nuse `just nix-build` for agent build validation.\n\n- `src/` - Main source code directory\n  - `QOwnNotes.pro` - Main qmake project file\n  - `CMakeLists.txt` - CMake build configuration\n  - `libraries/` - Third-party libraries (submodules)\n- `tests/` - Test files\n- `build-QOwnNotes/` - Default build directory (gitignored)\n- `justfile` - Task runner configuration\n- `scripts/` - Helper scripts\n- `docs/` - Documentation\n\n## Key Libraries & Dependencies\n\n### Required Qt Modules\n\n- Qt Core, GUI, Widgets, SQL, SVG, Network, XML\n- Qt PrintSupport, QML, WebSockets, Concurrent\n- Qt Quick (for Qt6, enables more scripting options)\n\n### Optional Dependencies\n\n- **Botan**: Cryptographic library (can use system or internal version)\n  - Default build uses system Botan: `USE_SYSTEM_BOTAN=1`\n- **Aspell**: Spell checking support\n- **QLiteHtml**: HTML rendering (optional, enable with `USE_QLITEHTML`)\n\n## Development Configuration\n\n### Build Modes (qmake)\n\n- **Debug Mode**: `CONFIG+=debug` - Includes debug symbols\n- **Dev Mode**: `CONFIG+=DEV_MODE` - Enables higher warning levels and precompiled headers\n\n### Build Modes (CMake)\n\n- **CMAKE_BUILD_TYPE=Debug** - Debug build with symbols\n- **CMAKE_BUILD_TYPE=Release** - Optimized release build\n- **DEV_MODE=ON** - Developer mode with extra warnings and -Werror on Linux\n\n### Common Configuration\n\nThe recommended development build uses:\n\n**qmake:**\n\n```bash\nqmake \"CONFIG+=debug USE_SYSTEM_BOTAN=1\" ../src/QOwnNotes.pro CONFIG+=DEV_MODE\n```\n\n**CMake:**\n\n```bash\ncmake ../src -DCMAKE_BUILD_TYPE=Debug -DDEV_MODE=ON\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\njust src-test\n```\n\nThis will:\n\n1. Build the unit tests with CMake and Qt6 in the `build-tests-QOwnNotes/` directory\n2. Run tests in minimal platform mode\n3. Clean up the test build directory\n\nThe unit tests are defined in `tests/CMakeLists.txt` (Qt6 only, the `INTEGRATION_TESTS` define is\nset there). To build and run them manually:\n\n```bash\ncmake -S tests -B build-tests -DCMAKE_BUILD_TYPE=Debug\ncmake --build build-tests --parallel\n./build-tests/bin/tests -platform minimal\n```\n\nWhen adding new test cases or application sources needed by the tests, add them to\n`tests/CMakeLists.txt`.\n\nFor VM tests (integration tests):\n\n```bash\njust vm-test\n```\n\n## Code Quality & Linting\n\n### Format Code\n\nFormat the entire project with clang-format:\n\n```bash\njust clang-format\n# Or aliases:\njust fix-linting\njust linter-fix\n```\n\n### Check Links\n\nValidate links in Markdown files:\n\n```bash\njust link-check\n```\n\n## Translation Workflow\n\n- **Download translations**: `just translations-download`\n- **Build translations**: `just translations-build`\n- **Upload to Crowdin**: `just translations-upload`\n- **Update translation files**: `just translations-update-files`\n- **Generate changelog line**: `just translations-changelog` (outputs a line like `- Added more ... translation (thank you, ...)`)\n\nTranslations are managed via Crowdin: https://crowdin.com/project/qownnotes\n\n## Important Notes for AI Assistants\n\n- **Always use `just nix-build` to build the project** - Don't try to run qmake/make directly unless specifically requested\n- **The project uses Qt/C++** - Be mindful of Qt's signal/slot mechanism, QObject lifecycle, and Qt-specific patterns\n- **Submodules are used** - Libraries in `src/libraries/` are git submodules\n- **Multiple Qt versions supported** - Code must work with both Qt 5.7+ and Qt6 (use Preprocessor Directives like `#if QT_VERSION < QT_VERSION_CHECK(5, 9, 0)` to handle differences)\n- **Cross-platform** - Code must work on Linux, macOS, and Windows\n- **Two build systems available** - Primary is qmake (`.pro` files), but CMake (`CMakeLists.txt`) is also supported\n- **Build projects** - The primary build project files are `src/QOwnNotes.pro` and `src/CMakeLists.txt`\n- **Development mode** - Use `CONFIG+=DEV_MODE` for qmake or `-DDEV_MODE=ON` for CMake in active development\n  -. **Version bumping** - Update `src/version.h` and `src/build_number.h`, `BUILD` just needs to be increase by one - Version format is `MAJOR.MINOR.PATCH` (e.g. `22.12.0`), build number is a separate integer that increments with each release - The MAJOR part is always the last two digits of the year of the release (e.g. `22` for 2022), - The MINOR part is the month of the release (e.g. `12` for December), - The PATCH part is a counter that starts at `0` and increments with each release in the same month\n  (e.g. `0` for the first release in December 2022, `1` for the second release in December 2022, etc.)\n- **Version bump commits** - Commit changes to `src/version.h` and `src/build_number.h` in their own separate commit with the exact message `release: bump version`. Do not include feature fixes, changelog entries, or other unrelated changes in that commit.\n- **This project has translations** - They can be found in the `src/translations/` directory as `.ts` files\n- **Comments** - Always write clear and concise comments for complex logic, especially when dealing with Qt-specific features, start comments with uppercase letters\n- **Changelog** - Update the changelog with each release, following the format in `CHANGELOG.md`\n- **Commit messages** - Follow the existing commit message style: short and descriptive, use a scope followed by a colon (e.g., `misc:`, `mainwindow:`, `tests:`, `ci:`), use imperative description after the colon (e.g., `fix`, `add`, `allow`, `update`, `refactor`), include issue number at the start when there is one (e.g., `#3568 mainwindow: allow dragging text file to import as note`). Keep commits focused so each commit represents one logical change.\n\n## Minimum Requirements\n\n- Qt 5.5+ or Qt 6.0+\n- GCC 4.8+\n- Desktop operating system supporting Qt\n\n## Useful Resources\n\n- Website: https://www.qownnotes.org\n- Documentation: https://www.qownnotes.org/getting-started/concept.html\n- GitHub Issues: https://github.com/pbek/QOwnNotes/issues\n- Script Repository: https://github.com/qownnotes/scripts\n- Changelog: https://www.qownnotes.org/changelog.html\n\n## Quick Reference Commands\n\n```bash\n# Build and run\njust src-build-run\n\n# Run tests\njust test\n\n# Format code\njust clang-format\n\n# Clean build\njust src-clean\n\n# List all available commands\njust --list\n```\n",".github/copilot-instructions.md":"# QOwnNotes - GitHub Copilot Instructions\n\n## Project Overview\n\nQOwnNotes is an open source notepad with Markdown support and todo list manager for GNU/Linux, macOS, and Windows. It works together with Nextcloud Notes and ownCloud Notes.\n\n- **Language**: C++\n- **Framework**: Qt (supports both Qt5 and Qt6)\n- **Build Systems**:\n  - **qmake** (`.pro` files) - Primary build system\n  - **CMake** (`CMakeLists.txt`) - Alternative build system\n- **Task Runner**: just (justfile)\n\n## Building the Application\n\n### Quick Build (Recommended for Development)\n\nUse the `just` task runner to build the application:\n\n```bash\njust src-build\n```\n\nThis command will:\n\n1. Check qmake version\n2. Create the `build-QOwnNotes` directory\n3. Run qmake with debug configuration and system Botan\n4. Build using all available CPU cores with `make -j$(nproc)`\n\n### Alternative Build Commands\n\n- **Run tests**: `just src-test` (or `just test`)\n- **Clean build directory**: `just src-clean`\n- **Build and run**: `just src-build-run`\n- **Run built application**: `just src-run`\n\n### Building with Nix\n\nFor Nix users, multiple build options are available:\n\n- **Qt6 build**: `just nix-build` or `just nix-build-qt6`\n- **Qt5 build**: `just nix-build-qt5`\n- **Force rebuild**: `just nix-build-force`\n\n### Manual Build with CMake\n\nAlternatively, use CMake for building:\n\n```bash\nmkdir build && cd build\n\n# Configure with Qt6\ncmake ../src -DQON_QT6_BUILD=ON -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Or with Qt5 (default)\ncmake ../src -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Build\nmake -j4\n```\n\n**Available CMake Options:**\n\n- `QON_QT6_BUILD=ON` - Build with Qt6 (default: OFF, uses Qt5)\n- `DEV_MODE=ON` - Enable developer mode with extra warnings\n- `BUILD_WITH_LIBGIT2=ON` - Use system libgit2 library\n- `BUILD_WITH_ASPELL=ON` - Enable aspell spell checking support\n- `USE_QLITEHTML=ON` - Use QLiteHtml for preview\n- `CMAKE_BUILD_TYPE=Debug|Release` - Build type\n\nExample with multiple options:\n\n```bash\ncmake ../src \\\n  -DQON_QT6_BUILD=ON \\\n  -DDEV_MODE=ON \\\n  -DBUILD_WITH_LIBGIT2=ON \\\n  -DBUILD_WITH_ASPELL=ON \\\n  -DCMAKE_BUILD_TYPE=Debug\n```\n\n## Project Structure\n\n- `src/` - Main source code directory\n  - `QOwnNotes.pro` - Main qmake project file\n  - `CMakeLists.txt` - CMake build configuration\n  - `libraries/` - Third-party libraries (submodules)\n- `tests/` - Test files\n- `build-QOwnNotes/` - Default build directory (gitignored)\n- `justfile` - Task runner configuration\n- `scripts/` - Helper scripts\n- `docs/` - Documentation\n\n## Key Libraries & Dependencies\n\n### Required Qt Modules\n\n- Qt Core, GUI, Widgets, SQL, SVG, Network, XML\n- Qt PrintSupport, QML, WebSockets, Concurrent\n- Qt Quick (for Qt6, enables more scripting options)\n\n### Optional Dependencies\n\n- **Botan**: Cryptographic library (can use system or internal version)\n  - Default build uses system Botan: `USE_SYSTEM_BOTAN=1`\n- **Aspell**: Spell checking support\n- **QLiteHtml**: HTML rendering (optional, enable with `USE_QLITEHTML`)\n\n## Development Configuration\n\n### Build Modes (qmake)\n\n- **Debug Mode**: `CONFIG+=debug` - Includes debug symbols\n- **Dev Mode**: `CONFIG+=DEV_MODE` - Enables higher warning levels and precompiled headers\n- **Integration Tests**: `DEFINES+=INTEGRATION_TESTS` - For test builds\n\n### Build Modes (CMake)\n\n- **CMAKE_BUILD_TYPE=Debug** - Debug build with symbols\n- **CMAKE_BUILD_TYPE=Release** - Optimized release build\n- **DEV_MODE=ON** - Developer mode with extra warnings and -Werror on Linux\n- **INTEGRATION_TESTS** - For test builds\n\n### Common Configuration\n\nThe recommended development build uses:\n\n**qmake:**\n\n```bash\nqmake \"CONFIG+=debug USE_SYSTEM_BOTAN=1\" ../src/QOwnNotes.pro CONFIG+=DEV_MODE\n```\n\n**CMake:**\n\n```bash\ncmake ../src -DCMAKE_BUILD_TYPE=Debug -DDEV_MODE=ON\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\njust src-test\n```\n\nThis will:\n\n1. Build tests in `build-tests-QOwnNotes/` directory\n2. Run tests in minimal platform mode\n3. Clean up the test build directory\n\nFor VM tests (integration tests):\n\n```bash\njust vm-test\n```\n\n## Code Quality & Linting\n\n### Format Code\n\nFormat the entire project with clang-format:\n\n```bash\njust clang-format\n# Or aliases:\njust fix-linting\njust linter-fix\n```\n\n### Check Links\n\nValidate links in Markdown files:\n\n```bash\njust link-check\n```\n\n## Translation Workflow\n\n- **Download translations**: `just translations-download`\n- **Build translations**: `just translations-build`\n- **Upload to Crowdin**: `just translations-upload`\n- **Update translation files**: `just translations-update-files`\n\nTranslations are managed via Crowdin: https://crowdin.com/project/qownnotes\n\n## Important Notes for AI Assistants\n\n1. **Always use `just src-build` to build the project** - Don't try to run qmake/make directly unless specifically requested\n2. **Always use `just nix-build` to build the project when asked to use nix**\n3. **The project uses Qt/C++** - Be mindful of Qt's signal/slot mechanism, QObject lifecycle, and Qt-specific patterns\n4. **Submodules are used** - Libraries in `src/libraries/` are git submodules\n5. **Multiple Qt versions supported** - Code must work with both Qt5 and Qt6\n6. **Cross-platform** - Code must work on Linux, macOS, and Windows\n7. **Two build systems available** - Primary is qmake (`.pro` files), but CMake (`CMakeLists.txt`) is also supported\n8. **Development mode** - Use `CONFIG+=DEV_MODE` for qmake or `-DDEV_MODE=ON` for CMake in active development\n9. **Version bumping** - Update `src/version.h` and `src/build_number.h`, `BUILD` just needs to be increase by one\n10. **This project has translations** - They can be found in the `src/translations/` directory as `.ts` files\n\n## Minimum Requirements\n\n- Qt 5.5+ or Qt 6.0+\n- GCC 4.8+\n- Desktop operating system supporting Qt\n\n## Useful Resources\n\n- Website: https://www.qownnotes.org\n- Documentation: https://www.qownnotes.org/getting-started/concept.html\n- GitHub Issues: https://github.com/pbek/QOwnNotes/issues\n- Script Repository: https://github.com/qownnotes/scripts\n- Changelog: https://www.qownnotes.org/changelog.html\n\n## Quick Reference Commands\n\n```bash\n# Build and run\njust src-build-run\n\n# Run tests\njust test\n\n# Format code\njust clang-format\n\n# Clean build\njust src-clean\n\n# List all available commands\njust --list\n```\n"},"files":{".opencode/skills/crowdin-translations/SKILL.md":"---\nname: Crowdin Translations\ndescription: Translate missing QOwnNotes application strings directly in Crowdin for German, Simplified Chinese, Russian, Italian, Brazilian Portuguese, Polish, French, and Spanish while preserving existing translations.\n---\n\n# Crowdin translations\n\nUse this skill to fill missing application translations in the QOwnNotes Crowdin\nproject. Creating or updating this skill alone does not authorize submitting\ntranslations. Respect Plan mode and obtain authorization before remote writes\nwhen the user's request does not already authorize them.\n\n## Default languages and scope\n\nUnless the user selects a subset, use all eight languages:\n\n| Requested locale | Crowdin language ID | Local application catalog          |\n| ---------------- | ------------------- | ---------------------------------- |\n| `de_DE`          | `de`                | `src/languages/QOwnNotes_de.ts`    |\n| `zh_CN`          | `zh-CN`             | `src/languages/QOwnNotes_zh_CN.ts` |\n| `ru_RU`          | `ru`                | `src/languages/QOwnNotes_ru.ts`    |\n| `it_IT`          | `it`                | `src/languages/QOwnNotes_it.ts`    |\n| `pt_BR`          | `pt-BR`             | `src/languages/QOwnNotes_pt_BR.ts` |\n| `pl_PL`          | `pl`                | `src/languages/QOwnNotes_pl.ts`    |\n| `fr_FR`          | `fr`                | `src/languages/QOwnNotes_fr.ts`    |\n| `es_ES`          | `es-ES`             | `src/languages/QOwnNotes_es.ts`    |\n\nConfirm language IDs against the live project. Read `crowdin.yaml` for the project\nID and file mapping rather than assuming they never change. The application\nsource is currently `src/languages/QOwnNotes_en.ts`, mapped to `/QOwnNotes_en.ts`\nin Crowdin. Do not confuse it with website Markdown or browser-extension files.\n\nDefault to application strings only. Do not expand to the website, change source\nstrings, download translations into the repository, update release files, or\ncommit changes unless requested. Keep temporary scripts, snapshots, and reports\nin a unique task directory under `/tmp/opencode`.\n\n## Safety rules\n\n- Fill missing translations and missing plural categories only. Preserve all\n  existing suggestions, effective translations, and approvals, even if they have\n  QA warnings. Fixing existing translations is a separate task.\n- Submit new translations without approving them. Do not reset approvals, vote,\n  or mark QA warnings resolved just to obtain a clean report.\n- Do not invoke paid MT or AI engines without explicit authorization. Translate\n  strings yourself; free reuse of existing project wording is preferable.\n- Use the installed CLI's credential resolution. Credentials may be in\n  `~/.crowdin.yaml` or the environment. Never print credentials, include tokens\n  in command arguments, or write them into the repository, reports, or skill.\n  When API calls are necessary, load credentials privately into process memory\n  and use an Authorization header. Redact sensitive errors.\n- Never use generic `crowdin upload` or `just translations-upload` for this task:\n  they upload source files, not just the missing translations.\n\n## Workflow\n\n### 1. Discover live gaps\n\n1. Read repository instructions and `crowdin.yaml`; check `git status --short`.\n2. Check `crowdin --help` and relevant subcommand help for the installed version.\n   Verify access with `crowdin status --no-progress --no-colors`.\n3. Resolve the application file ID and requested languages using the live API.\n   Fetch source strings, including their context, identifiers, and plural data.\n4. Snapshot existing translations and approvals as needed for preservation\n   checks. Local `.ts` files can provide context, but they may be stale and their\n   unfinished counts are not authoritative Crowdin counts.\n5. Paginate API collections completely. A typical page size is 500; honor the\n   endpoint's actual limits. Keep a resumable submission log.\n\nUseful API v2 paths, relative to `https://api.crowdin.com/api/v2`:\n\n```text\nGET /projects/{projectId}\nGET /projects/{projectId}/files\nGET /projects/{projectId}/strings?fileId={fileId}\nGET /projects/{projectId}/languages/{languageId}/translations?fileId={fileId}\nGET /projects/{projectId}/translations?stringId={stringId}&languageId={languageId}\nGET /projects/{projectId}/files/{fileId}/languages/progress\n```\n\nThe language-translations endpoint returns plain `text` or a `plurals` array.\nIt can omit incompletely translated plural strings entirely. An absent entry\ntherefore does **not** prove that a string has no existing suggestions. Query\nthe string-translations endpoint before writing; for plurals, check each\n`pluralCategoryName` separately and preserve the categories already present.\nSkip hidden source strings unless explicitly requested.\n\n### 2. Reuse established translations\n\nIf authorized to write, first try perfect translation-memory matches for missing\napplication strings only. For the current CLI, the command is:\n\n```sh\ncrowdin pre-translate --method=tm --file=/QOwnNotes_en.ts \\\n  -l de -l zh-CN -l ru -l it -l pt-BR -l pl -l fr -l es-ES \\\n  --translate-untranslated-only --translate-with-perfect-match-only \\\n  --no-duplicate-translations --no-progress --no-colors\n```\n\nAdjust the languages and file path to the requested scope. Leave auto-approval\nunset. Refresh gaps afterward. Never assume that a successful TM job filled all\ngaps or that fuzzy matches are acceptable without review.\n\nAn existing translation of exactly the same source text can be reused if the\ncontexts have the same meaning and there are no conflicting translations. Do\nnot propagate ambiguous short labels blindly. Check the glossary and surrounding\nUI wording before writing new translations.\n\n### 3. Translate and validate\n\nWork in manageable batches and use source contexts and application code to\nresolve ambiguities. Preserve product names, commands, protocol names, and\nliteral examples unless localization is appropriate. Numeric bookmark slots can\nshare a reviewed translation template when only the slot number changes.\n\nBefore submission, check:\n\n- Qt placeholders, including `%1`, `%2`, `%L1`, `%n`, `%Ln`, `%v`, and `%m`.\n  Preserve their identities and multiplicity; allow grammatical reordering.\n- HTML tags, attributes, URLs, Markdown links, command-line flags, and constants\n  such as `QOWNNOTESAPI_MIN_VERSION`.\n- Meaningful line breaks, leading/trailing spaces used for concatenation, and\n  Qt `&` keyboard accelerators. Accelerators can move to a suitable letter.\n- Natural punctuation and ellipses for each locale. Chinese UI strings may need\n  `。` and `……` rather than English punctuation.\n- All plural categories required by the live language metadata, not merely the\n  categories present in the English source. In particular, Russian and Polish\n  also require `few` and `many`; preserve an existing `other` category as well.\n  Read `pluralCategoryNames` instead of hardcoding a universal category list.\n- Correct singular, plural, gender, and case. Do not copy English `(s)` notation\n  into natural translated plural forms or remove `%n` from singular forms.\n\n### 4. Submit missing entries only\n\nPrefer the CLI where it supports the operation safely. For individual missing\nstrings, the API avoids uploading whole catalogs or unrelated files:\n\n```text\nPOST /projects/{projectId}/translations\n{\n  \"stringId\": 123,\n  \"languageId\": \"fr\",\n  \"text\": \"...\",\n  \"pluralCategoryName\": \"one\"\n}\n```\n\nOmit `pluralCategoryName` for nonplural strings. Immediately before posting,\nrecheck existing suggestions for that string/language/category. Skip entries\nsomeone else has translated in the meantime. Do not approve the result.\n\nUse bounded concurrency, respect rate limits, and retry transient failures with\nbackoff. After an ambiguous POST failure, recheck whether the translation was\ncreated before retrying. Log language, string ID, plural category, submitted text,\nand returned translation ID. Resume from that log instead of duplicating work.\nDo not run overlapping upload batches for the same string/language/category.\n\nCrowdin's individual translation endpoint does not support editing text with a\nJSON Patch request. If one of **this task's own new submissions** needs correction,\nverify its ID and unchanged text, add the corrected suggestion, then remove only\nthat exact task-created suggestion. Log the replacement ID. Never delete a\npre-existing or externally edited translation.\n\n### 5. Verify and report\n\n1. Wait for all submitted batches to finish, then refetch effective translations\n   and application-file language progress.\n2. Verify that every active source string has all required translated categories,\n   all submitted placeholders remain valid, and pre-existing translations and\n   approvals are unchanged. Recheck partial plural strings explicitly.\n3. Review Crowdin QA warnings for the new translation IDs/categories. Product\n   names, German compounds, Chinese accelerator notation, and omitted English\n   `(s)` notation can cause false positives. Glossary checks may also mistake\n   parts of compounds or confuse a tab character with a UI tab. Fix real issues,\n   but do not distort valid translations or dismiss existing warnings.\n4. Confirm repository files remain unchanged unless changes were requested.\n5. Report live application-file completion for each language, any remaining gaps\n   or blockers, and that new entries await review. Do not equate \"100% translated\"\n   with \"100% approved\" or imply the website was translated.\n","AGENTS.md":"# QOwnNotes - Agents Instructions\n\n## Project Overview\n\nQOwnNotes is an open source notepad with Markdown support and todo list manager for GNU/Linux, macOS, and Windows. It works together with Nextcloud Notes and ownCloud Notes.\n\n- **Language**: C++\n- **Framework**: Qt (supports both Qt5 and Qt6)\n- **Build Systems**:\n  - **qmake** (`.pro` files) - Primary build system\n  - **CMake** (`CMakeLists.txt`) - Alternative build system\n- **Task Runner**: just (justfile)\n\n## Building the Application\n\n### Quick Build (Recommended for Development)\n\nUse the `just` task runner to build the application:\n\n```bash\njust src-build\n```\n\nThis command will:\n\n1. Check qmake version\n2. Create the `build-QOwnNotes` directory\n3. Run qmake with debug configuration and system Botan\n4. Build using all available CPU cores with `make -j$(nproc)`\n\n### Alternative Build Commands\n\n- **Run tests**: `just src-test` (or `just test`)\n- **Clean build directory**: `just src-clean`\n- **Build and run**: `just src-build-run`\n- **Run built application**: `just src-run`\n\n### Building with Nix\n\nFor Nix users, multiple build options are available:\n\n- **Qt5 build**: `just nix-build-qt5`\n- **Qt6 with KDE integration (Linux)**: `just build` or `just nix-build`\n- **Plain Qt6 build**: `just nix-build-qt6`\n- **Force rebuild**: `just nix-build-force`\n\n### Manual Build with CMake\n\nAlternatively, use CMake for building:\n\n```bash\nmkdir build && cd build\n\n# Configure with Qt6\ncmake ../src -DQON_QT6_BUILD=ON -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Or with Qt5 (default)\ncmake ../src -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Build\nmake -j4\n```\n\n**Available CMake Options:**\n\n- `QON_QT6_BUILD=ON` - Build with Qt6 (default: OFF, uses Qt5)\n- `QON_KDE_INTEGRATION=ON` - Optional KDE Frameworks 6 integration (default: OFF,\n  Linux and Qt6 only; requires Extra CMake Modules, KColorScheme, KCoreAddons, KCrash, KGlobalAccel, KNotifications, KWindowSystem, Purpose, and PlasmaActivities)\n- `DEV_MODE=ON` - Enable developer mode with extra warnings\n- `BUILD_WITH_LIBGIT2=ON` - Use system libgit2 library\n- `BUILD_WITH_ASPELL=ON` - Enable aspell spell checking support\n- `USE_QLITEHTML=ON` - Use QLiteHtml for preview\n- `CMAKE_BUILD_TYPE=Debug|Release` - Build type\n\nExample with multiple options:\n\n```bash\ncmake ../src \\\n  -DQON_QT6_BUILD=ON \\\n  -DDEV_MODE=ON \\\n  -DBUILD_WITH_LIBGIT2=ON \\\n  -DBUILD_WITH_ASPELL=ON \\\n  -DCMAKE_BUILD_TYPE=Debug\n```\n\n## Project Structure\n\nFor the KDE integration roadmap and build instructions, see `docs/kde-integration.md`.\n`just src-build-kde` provides a CMake development recipe in a KDE-enabled environment;\nuse `just nix-build` for agent build validation.\n\n- `src/` - Main source code directory\n  - `QOwnNotes.pro` - Main qmake project file\n  - `CMakeLists.txt` - CMake build configuration\n  - `libraries/` - Third-party libraries (submodules)\n- `tests/` - Test files\n- `build-QOwnNotes/` - Default build directory (gitignored)\n- `justfile` - Task runner configuration\n- `scripts/` - Helper scripts\n- `docs/` - Documentation\n\n## Key Libraries & Dependencies\n\n### Required Qt Modules\n\n- Qt Core, GUI, Widgets, SQL, SVG, Network, XML\n- Qt PrintSupport, QML, WebSockets, Concurrent\n- Qt Quick (for Qt6, enables more scripting options)\n\n### Optional Dependencies\n\n- **Botan**: Cryptographic library (can use system or internal version)\n  - Default build uses system Botan: `USE_SYSTEM_BOTAN=1`\n- **Aspell**: Spell checking support\n- **QLiteHtml**: HTML rendering (optional, enable with `USE_QLITEHTML`)\n\n## Development Configuration\n\n### Build Modes (qmake)\n\n- **Debug Mode**: `CONFIG+=debug` - Includes debug symbols\n- **Dev Mode**: `CONFIG+=DEV_MODE` - Enables higher warning levels and precompiled headers\n\n### Build Modes (CMake)\n\n- **CMAKE_BUILD_TYPE=Debug** - Debug build with symbols\n- **CMAKE_BUILD_TYPE=Release** - Optimized release build\n- **DEV_MODE=ON** - Developer mode with extra warnings and -Werror on Linux\n\n### Common Configuration\n\nThe recommended development build uses:\n\n**qmake:**\n\n```bash\nqmake \"CONFIG+=debug USE_SYSTEM_BOTAN=1\" ../src/QOwnNotes.pro CONFIG+=DEV_MODE\n```\n\n**CMake:**\n\n```bash\ncmake ../src -DCMAKE_BUILD_TYPE=Debug -DDEV_MODE=ON\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\njust src-test\n```\n\nThis will:\n\n1. Build the unit tests with CMake and Qt6 in the `build-tests-QOwnNotes/` directory\n2. Run tests in minimal platform mode\n3. Clean up the test build directory\n\nThe unit tests are defined in `tests/CMakeLists.txt` (Qt6 only, the `INTEGRATION_TESTS` define is\nset there). To build and run them manually:\n\n```bash\ncmake -S tests -B build-tests -DCMAKE_BUILD_TYPE=Debug\ncmake --build build-tests --parallel\n./build-tests/bin/tests -platform minimal\n```\n\nWhen adding new test cases or application sources needed by the tests, add them to\n`tests/CMakeLists.txt`.\n\nFor VM tests (integration tests):\n\n```bash\njust vm-test\n```\n\n## Code Quality & Linting\n\n### Format Code\n\nFormat the entire project with clang-format:\n\n```bash\njust clang-format\n# Or aliases:\njust fix-linting\njust linter-fix\n```\n\n### Check Links\n\nValidate links in Markdown files:\n\n```bash\njust link-check\n```\n\n## Translation Workflow\n\n- **Download translations**: `just translations-download`\n- **Build translations**: `just translations-build`\n- **Upload to Crowdin**: `just translations-upload`\n- **Update translation files**: `just translations-update-files`\n- **Generate changelog line**: `just translations-changelog` (outputs a line like `- Added more ... translation (thank you, ...)`)\n\nTranslations are managed via Crowdin: https://crowdin.com/project/qownnotes\n\n## Important Notes for AI Assistants\n\n- **Always use `just nix-build` to build the project** - Don't try to run qmake/make directly unless specifically requested\n- **The project uses Qt/C++** - Be mindful of Qt's signal/slot mechanism, QObject lifecycle, and Qt-specific patterns\n- **Submodules are used** - Libraries in `src/libraries/` are git submodules\n- **Multiple Qt versions supported** - Code must work with both Qt 5.7+ and Qt6 (use Preprocessor Directives like `#if QT_VERSION < QT_VERSION_CHECK(5, 9, 0)` to handle differences)\n- **Cross-platform** - Code must work on Linux, macOS, and Windows\n- **Two build systems available** - Primary is qmake (`.pro` files), but CMake (`CMakeLists.txt`) is also supported\n- **Build projects** - The primary build project files are `src/QOwnNotes.pro` and `src/CMakeLists.txt`\n- **Development mode** - Use `CONFIG+=DEV_MODE` for qmake or `-DDEV_MODE=ON` for CMake in active development\n  -. **Version bumping** - Update `src/version.h` and `src/build_number.h`, `BUILD` just needs to be increase by one - Version format is `MAJOR.MINOR.PATCH` (e.g. `22.12.0`), build number is a separate integer that increments with each release - The MAJOR part is always the last two digits of the year of the release (e.g. `22` for 2022), - The MINOR part is the month of the release (e.g. `12` for December), - The PATCH part is a counter that starts at `0` and increments with each release in the same month\n  (e.g. `0` for the first release in December 2022, `1` for the second release in December 2022, etc.)\n- **Version bump commits** - Commit changes to `src/version.h` and `src/build_number.h` in their own separate commit with the exact message `release: bump version`. Do not include feature fixes, changelog entries, or other unrelated changes in that commit.\n- **This project has translations** - They can be found in the `src/translations/` directory as `.ts` files\n- **Comments** - Always write clear and concise comments for complex logic, especially when dealing with Qt-specific features, start comments with uppercase letters\n- **Changelog** - Update the changelog with each release, following the format in `CHANGELOG.md`\n- **Commit messages** - Follow the existing commit message style: short and descriptive, use a scope followed by a colon (e.g., `misc:`, `mainwindow:`, `tests:`, `ci:`), use imperative description after the colon (e.g., `fix`, `add`, `allow`, `update`, `refactor`), include issue number at the start when there is one (e.g., `#3568 mainwindow: allow dragging text file to import as note`). Keep commits focused so each commit represents one logical change.\n\n## Minimum Requirements\n\n- Qt 5.5+ or Qt 6.0+\n- GCC 4.8+\n- Desktop operating system supporting Qt\n\n## Useful Resources\n\n- Website: https://www.qownnotes.org\n- Documentation: https://www.qownnotes.org/getting-started/concept.html\n- GitHub Issues: https://github.com/pbek/QOwnNotes/issues\n- Script Repository: https://github.com/qownnotes/scripts\n- Changelog: https://www.qownnotes.org/changelog.html\n\n## Quick Reference Commands\n\n```bash\n# Build and run\njust src-build-run\n\n# Run tests\njust test\n\n# Format code\njust clang-format\n\n# Clean build\njust src-clean\n\n# List all available commands\njust --list\n```\n",".github/copilot-instructions.md":"# QOwnNotes - GitHub Copilot Instructions\n\n## Project Overview\n\nQOwnNotes is an open source notepad with Markdown support and todo list manager for GNU/Linux, macOS, and Windows. It works together with Nextcloud Notes and ownCloud Notes.\n\n- **Language**: C++\n- **Framework**: Qt (supports both Qt5 and Qt6)\n- **Build Systems**:\n  - **qmake** (`.pro` files) - Primary build system\n  - **CMake** (`CMakeLists.txt`) - Alternative build system\n- **Task Runner**: just (justfile)\n\n## Building the Application\n\n### Quick Build (Recommended for Development)\n\nUse the `just` task runner to build the application:\n\n```bash\njust src-build\n```\n\nThis command will:\n\n1. Check qmake version\n2. Create the `build-QOwnNotes` directory\n3. Run qmake with debug configuration and system Botan\n4. Build using all available CPU cores with `make -j$(nproc)`\n\n### Alternative Build Commands\n\n- **Run tests**: `just src-test` (or `just test`)\n- **Clean build directory**: `just src-clean`\n- **Build and run**: `just src-build-run`\n- **Run built application**: `just src-run`\n\n### Building with Nix\n\nFor Nix users, multiple build options are available:\n\n- **Qt6 build**: `just nix-build` or `just nix-build-qt6`\n- **Qt5 build**: `just nix-build-qt5`\n- **Force rebuild**: `just nix-build-force`\n\n### Manual Build with CMake\n\nAlternatively, use CMake for building:\n\n```bash\nmkdir build && cd build\n\n# Configure with Qt6\ncmake ../src -DQON_QT6_BUILD=ON -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Or with Qt5 (default)\ncmake ../src -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Build\nmake -j4\n```\n\n**Available CMake Options:**\n\n- `QON_QT6_BUILD=ON` - Build with Qt6 (default: OFF, uses Qt5)\n- `DEV_MODE=ON` - Enable developer mode with extra warnings\n- `BUILD_WITH_LIBGIT2=ON` - Use system libgit2 library\n- `BUILD_WITH_ASPELL=ON` - Enable aspell spell checking support\n- `USE_QLITEHTML=ON` - Use QLiteHtml for preview\n- `CMAKE_BUILD_TYPE=Debug|Release` - Build type\n\nExample with multiple options:\n\n```bash\ncmake ../src \\\n  -DQON_QT6_BUILD=ON \\\n  -DDEV_MODE=ON \\\n  -DBUILD_WITH_LIBGIT2=ON \\\n  -DBUILD_WITH_ASPELL=ON \\\n  -DCMAKE_BUILD_TYPE=Debug\n```\n\n## Project Structure\n\n- `src/` - Main source code directory\n  - `QOwnNotes.pro` - Main qmake project file\n  - `CMakeLists.txt` - CMake build configuration\n  - `libraries/` - Third-party libraries (submodules)\n- `tests/` - Test files\n- `build-QOwnNotes/` - Default build directory (gitignored)\n- `justfile` - Task runner configuration\n- `scripts/` - Helper scripts\n- `docs/` - Documentation\n\n## Key Libraries & Dependencies\n\n### Required Qt Modules\n\n- Qt Core, GUI, Widgets, SQL, SVG, Network, XML\n- Qt PrintSupport, QML, WebSockets, Concurrent\n- Qt Quick (for Qt6, enables more scripting options)\n\n### Optional Dependencies\n\n- **Botan**: Cryptographic library (can use system or internal version)\n  - Default build uses system Botan: `USE_SYSTEM_BOTAN=1`\n- **Aspell**: Spell checking support\n- **QLiteHtml**: HTML rendering (optional, enable with `USE_QLITEHTML`)\n\n## Development Configuration\n\n### Build Modes (qmake)\n\n- **Debug Mode**: `CONFIG+=debug` - Includes debug symbols\n- **Dev Mode**: `CONFIG+=DEV_MODE` - Enables higher warning levels and precompiled headers\n- **Integration Tests**: `DEFINES+=INTEGRATION_TESTS` - For test builds\n\n### Build Modes (CMake)\n\n- **CMAKE_BUILD_TYPE=Debug** - Debug build with symbols\n- **CMAKE_BUILD_TYPE=Release** - Optimized release build\n- **DEV_MODE=ON** - Developer mode with extra warnings and -Werror on Linux\n- **INTEGRATION_TESTS** - For test builds\n\n### Common Configuration\n\nThe recommended development build uses:\n\n**qmake:**\n\n```bash\nqmake \"CONFIG+=debug USE_SYSTEM_BOTAN=1\" ../src/QOwnNotes.pro CONFIG+=DEV_MODE\n```\n\n**CMake:**\n\n```bash\ncmake ../src -DCMAKE_BUILD_TYPE=Debug -DDEV_MODE=ON\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\njust src-test\n```\n\nThis will:\n\n1. Build tests in `build-tests-QOwnNotes/` directory\n2. Run tests in minimal platform mode\n3. Clean up the test build directory\n\nFor VM tests (integration tests):\n\n```bash\njust vm-test\n```\n\n## Code Quality & Linting\n\n### Format Code\n\nFormat the entire project with clang-format:\n\n```bash\njust clang-format\n# Or aliases:\njust fix-linting\njust linter-fix\n```\n\n### Check Links\n\nValidate links in Markdown files:\n\n```bash\njust link-check\n```\n\n## Translation Workflow\n\n- **Download translations**: `just translations-download`\n- **Build translations**: `just translations-build`\n- **Upload to Crowdin**: `just translations-upload`\n- **Update translation files**: `just translations-update-files`\n\nTranslations are managed via Crowdin: https://crowdin.com/project/qownnotes\n\n## Important Notes for AI Assistants\n\n1. **Always use `just src-build` to build the project** - Don't try to run qmake/make directly unless specifically requested\n2. **Always use `just nix-build` to build the project when asked to use nix**\n3. **The project uses Qt/C++** - Be mindful of Qt's signal/slot mechanism, QObject lifecycle, and Qt-specific patterns\n4. **Submodules are used** - Libraries in `src/libraries/` are git submodules\n5. **Multiple Qt versions supported** - Code must work with both Qt5 and Qt6\n6. **Cross-platform** - Code must work on Linux, macOS, and Windows\n7. **Two build systems available** - Primary is qmake (`.pro` files), but CMake (`CMakeLists.txt`) is also supported\n8. **Development mode** - Use `CONFIG+=DEV_MODE` for qmake or `-DDEV_MODE=ON` for CMake in active development\n9. **Version bumping** - Update `src/version.h` and `src/build_number.h`, `BUILD` just needs to be increase by one\n10. **This project has translations** - They can be found in the `src/translations/` directory as `.ts` files\n\n## Minimum Requirements\n\n- Qt 5.5+ or Qt 6.0+\n- GCC 4.8+\n- Desktop operating system supporting Qt\n\n## Useful Resources\n\n- Website: https://www.qownnotes.org\n- Documentation: https://www.qownnotes.org/getting-started/concept.html\n- GitHub Issues: https://github.com/pbek/QOwnNotes/issues\n- Script Repository: https://github.com/qownnotes/scripts\n- Changelog: https://www.qownnotes.org/changelog.html\n\n## Quick Reference Commands\n\n```bash\n# Build and run\njust src-build-run\n\n# Run tests\njust test\n\n# Format code\njust clang-format\n\n# Clean build\njust src-clean\n\n# List all available commands\njust --list\n```\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/pbek/QOwnNotes/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# QOwnNotes - Agents Instructions\n\n## Project Overview\n\nQOwnNotes is an open source notepad with Markdown support and todo list manager for GNU/Linux, macOS, and Windows. It works together with Nextcloud Notes and ownCloud Notes.\n\n- **Language**: C++\n- **Framework**: Qt (supports both Qt5 and Qt6)\n- **Build Systems**:\n  - **qmake** (`.pro` files) - Primary build system\n  - **CMake** (`CMakeLists.txt`) - Alternative build system\n- **Task Runner**: just (justfile)\n\n## Building the Application\n\n### Quick Build (Recommended for Development)\n\nUse the `just` task runner to build the application:\n\n```bash\njust src-build\n```\n\nThis command will:\n\n1. Check qmake version\n2. Create the `build-QOwnNotes` directory\n3. Run qmake with debug configuration and system Botan\n4. Build using all available CPU cores with `make -j$(nproc)`\n\n### Alternative Build Commands\n\n- **Run tests**: `just src-test` (or `just test`)\n- **Clean build directory**: `just src-clean`\n- **Build and run**: `just src-build-run`\n- **Run built application**: `just src-run`\n\n### Building with Nix\n\nFor Nix users, multiple build options are available:\n\n- **Qt5 build**: `just nix-build-qt5`\n- **Qt6 with KDE integration (Linux)**: `just build` or `just nix-build`\n- **Plain Qt6 build**: `just nix-build-qt6`\n- **Force rebuild**: `just nix-build-force`\n\n### Manual Build with CMake\n\nAlternatively, use CMake for building:\n\n```bash\nmkdir build && cd build\n\n# Configure with Qt6\ncmake ../src -DQON_QT6_BUILD=ON -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Or with Qt5 (default)\ncmake ../src -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Build\nmake -j4\n```\n\n**Available CMake Options:**\n\n- `QON_QT6_BUILD=ON` - Build with Qt6 (default: OFF, uses Qt5)\n- `QON_KDE_INTEGRATION=ON` - Optional KDE Frameworks 6 integration (default: OFF,\n  Linux and Qt6 only; requires Extra CMake Modules, KColorScheme, KCoreAddons, KCrash, KGlobalAccel, KNotifications, KWindowSystem, Purpose, and PlasmaActivities)\n- `DEV_MODE=ON` - Enable developer mode with extra warnings\n- `BUILD_WITH_LIBGIT2=ON` - Use system libgit2 library\n- `BUILD_WITH_ASPELL=ON` - Enable aspell spell checking support\n- `USE_QLITEHTML=ON` - Use QLiteHtml for preview\n- `CMAKE_BUILD_TYPE=Debug|Release` - Build type\n\nExample with multiple options:\n\n```bash\ncmake ../src \\\n  -DQON_QT6_BUILD=ON \\\n  -DDEV_MODE=ON \\\n  -DBUILD_WITH_LIBGIT2=ON \\\n  -DBUILD_WITH_ASPELL=ON \\\n  -DCMAKE_BUILD_TYPE=Debug\n```\n\n## Project Structure\n\nFor the KDE integration roadmap and build instructions, see `docs/kde-integration.md`.\n`just src-build-kde` provides a CMake development recipe in a KDE-enabled environment;\nuse `just nix-build` for agent build validation.\n\n- `src/` - Main source code directory\n  - `QOwnNotes.pro` - Main qmake project file\n  - `CMakeLists.txt` - CMake build configuration\n  - `libraries/` - Third-party libraries (submodules)\n- `tests/` - Test files\n- `build-QOwnNotes/` - Default build directory (gitignored)\n- `justfile` - Task runner configuration\n- `scripts/` - Helper scripts\n- `docs/` - Documentation\n\n## Key Libraries & Dependencies\n\n### Required Qt Modules\n\n- Qt Core, GUI, Widgets, SQL, SVG, Network, XML\n- Qt PrintSupport, QML, WebSockets, Concurrent\n- Qt Quick (for Qt6, enables more scripting options)\n\n### Optional Dependencies\n\n- **Botan**: Cryptographic library (can use system or internal version)\n  - Default build uses system Botan: `USE_SYSTEM_BOTAN=1`\n- **Aspell**: Spell checking support\n- **QLiteHtml**: HTML rendering (optional, enable with `USE_QLITEHTML`)\n\n## Development Configuration\n\n### Build Modes (qmake)\n\n- **Debug Mode**: `CONFIG+=debug` - Includes debug symbols\n- **Dev Mode**: `CONFIG+=DEV_MODE` - Enables higher warning levels and precompiled headers\n\n### Build Modes (CMake)\n\n- **CMAKE_BUILD_TYPE=Debug** - Debug build with symbols\n- **CMAKE_BUILD_TYPE=Release** - Optimized release build\n- **DEV_MODE=ON** - Developer mode with extra warnings and -Werror on Linux\n\n### Common Configuration\n\nThe recommended development build uses:\n\n**qmake:**\n\n```bash\nqmake \"CONFIG+=debug USE_SYSTEM_BOTAN=1\" ../src/QOwnNotes.pro CONFIG+=DEV_MODE\n```\n\n**CMake:**\n\n```bash\ncmake ../src -DCMAKE_BUILD_TYPE=Debug -DDEV_MODE=ON\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\njust src-test\n```\n\nThis will:\n\n1. Build the unit tests with CMake and Qt6 in the `build-tests-QOwnNotes/` directory\n2. Run tests in minimal platform mode\n3. Clean up the test build directory\n\nThe unit tests are defined in `tests/CMakeLists.txt` (Qt6 only, the `INTEGRATION_TESTS` define is\nset there). To build and run them manually:\n\n```bash\ncmake -S tests -B build-tests -DCMAKE_BUILD_TYPE=Debug\ncmake --build build-tests --parallel\n./build-tests/bin/tests -platform minimal\n```\n\nWhen adding new test cases or application sources needed by the tests, add them to\n`tests/CMakeLists.txt`.\n\nFor VM tests (integration tests):\n\n```bash\njust vm-test\n```\n\n## Code Quality & Linting\n\n### Format Code\n\nFormat the entire project with clang-format:\n\n```bash\njust clang-format\n# Or aliases:\njust fix-linting\njust linter-fix\n```\n\n### Check Links\n\nValidate links in Markdown files:\n\n```bash\njust link-check\n```\n\n## Translation Workflow\n\n- **Download translations**: `just translations-download`\n- **Build translations**: `just translations-build`\n- **Upload to Crowdin**: `just translations-upload`\n- **Update translation files**: `just translations-update-files`\n- **Generate changelog line**: `just translations-changelog` (outputs a line like `- Added more ... translation (thank you, ...)`)\n\nTranslations are managed via Crowdin: https://crowdin.com/project/qownnotes\n\n## Important Notes for AI Assistants\n\n- **Always use `just nix-build` to build the project** - Don't try to run qmake/make directly unless specifically requested\n- **The project uses Qt/C++** - Be mindful of Qt's signal/slot mechanism, QObject lifecycle, and Qt-specific patterns\n- **Submodules are used** - Libraries in `src/libraries/` are git submodules\n- **Multiple Qt versions supported** - Code must work with both Qt 5.7+ and Qt6 (use Preprocessor Directives like `#if QT_VERSION < QT_VERSION_CHECK(5, 9, 0)` to handle differences)\n- **Cross-platform** - Code must work on Linux, macOS, and Windows\n- **Two build systems available** - Primary is qmake (`.pro` files), but CMake (`CMakeLists.txt`) is also supported\n- **Build projects** - The primary build project files are `src/QOwnNotes.pro` and `src/CMakeLists.txt`\n- **Development mode** - Use `CONFIG+=DEV_MODE` for qmake or `-DDEV_MODE=ON` for CMake in active development\n  -. **Version bumping** - Update `src/version.h` and `src/build_number.h`, `BUILD` just needs to be increase by one - Version format is `MAJOR.MINOR.PATCH` (e.g. `22.12.0`), build number is a separate integer that increments with each release - The MAJOR part is always the last two digits of the year of the release (e.g. `22` for 2022), - The MINOR part is the month of the release (e.g. `12` for December), - The PATCH part is a counter that starts at `0` and increments with each release in the same month\n  (e.g. `0` for the first release in December 2022, `1` for the second release in December 2022, etc.)\n- **Version bump commits** - Commit changes to `src/version.h` and `src/build_number.h` in their own separate commit with the exact message `release: bump version`. Do not include feature fixes, changelog entries, or other unrelated changes in that commit.\n- **This project has translations** - They can be found in the `src/translations/` directory as `.ts` files\n- **Comments** - Always write clear and concise comments for complex logic, especially when dealing with Qt-specific features, start comments with uppercase letters\n- **Changelog** - Update the changelog with each release, following the format in `CHANGELOG.md`\n- **Commit messages** - Follow the existing commit message style: short and descriptive, use a scope followed by a colon (e.g., `misc:`, `mainwindow:`, `tests:`, `ci:`), use imperative description after the colon (e.g., `fix`, `add`, `allow`, `update`, `refactor`), include issue number at the start when there is one (e.g., `#3568 mainwindow: allow dragging text file to import as note`). Keep commits focused so each commit represents one logical change.\n\n## Minimum Requirements\n\n- Qt 5.5+ or Qt 6.0+\n- GCC 4.8+\n- Desktop operating system supporting Qt\n\n## Useful Resources\n\n- Website: https://www.qownnotes.org\n- Documentation: https://www.qownnotes.org/getting-started/concept.html\n- GitHub Issues: https://github.com/pbek/QOwnNotes/issues\n- Script Repository: https://github.com/qownnotes/scripts\n- Changelog: https://www.qownnotes.org/changelog.html\n\n## Quick Reference Commands\n\n```bash\n# Build and run\njust src-build-run\n\n# Run tests\njust test\n\n# Format code\njust clang-format\n\n# Clean build\njust src-clean\n\n# List all available commands\njust --list\n```\n","isInternal":false,"tokens":2306,"sizeBytes":8812},{"name":"SKILL.md","path":".opencode/skills/crowdin-translations/SKILL.md","rawUrl":"https://raw.githubusercontent.com/pbek/QOwnNotes/HEAD/.opencode/skills/crowdin-translations/SKILL.md","title":"Crowdin Translations","category":"anthropic-skill","format":"markdown","content":"---\nname: Crowdin Translations\ndescription: Translate missing QOwnNotes application strings directly in Crowdin for German, Simplified Chinese, Russian, Italian, Brazilian Portuguese, Polish, French, and Spanish while preserving existing translations.\n---\n\n# Crowdin translations\n\nUse this skill to fill missing application translations in the QOwnNotes Crowdin\nproject. Creating or updating this skill alone does not authorize submitting\ntranslations. Respect Plan mode and obtain authorization before remote writes\nwhen the user's request does not already authorize them.\n\n## Default languages and scope\n\nUnless the user selects a subset, use all eight languages:\n\n| Requested locale | Crowdin language ID | Local application catalog          |\n| ---------------- | ------------------- | ---------------------------------- |\n| `de_DE`          | `de`                | `src/languages/QOwnNotes_de.ts`    |\n| `zh_CN`          | `zh-CN`             | `src/languages/QOwnNotes_zh_CN.ts` |\n| `ru_RU`          | `ru`                | `src/languages/QOwnNotes_ru.ts`    |\n| `it_IT`          | `it`                | `src/languages/QOwnNotes_it.ts`    |\n| `pt_BR`          | `pt-BR`             | `src/languages/QOwnNotes_pt_BR.ts` |\n| `pl_PL`          | `pl`                | `src/languages/QOwnNotes_pl.ts`    |\n| `fr_FR`          | `fr`                | `src/languages/QOwnNotes_fr.ts`    |\n| `es_ES`          | `es-ES`             | `src/languages/QOwnNotes_es.ts`    |\n\nConfirm language IDs against the live project. Read `crowdin.yaml` for the project\nID and file mapping rather than assuming they never change. The application\nsource is currently `src/languages/QOwnNotes_en.ts`, mapped to `/QOwnNotes_en.ts`\nin Crowdin. Do not confuse it with website Markdown or browser-extension files.\n\nDefault to application strings only. Do not expand to the website, change source\nstrings, download translations into the repository, update release files, or\ncommit changes unless requested. Keep temporary scripts, snapshots, and reports\nin a unique task directory under `/tmp/opencode`.\n\n## Safety rules\n\n- Fill missing translations and missing plural categories only. Preserve all\n  existing suggestions, effective translations, and approvals, even if they have\n  QA warnings. Fixing existing translations is a separate task.\n- Submit new translations without approving them. Do not reset approvals, vote,\n  or mark QA warnings resolved just to obtain a clean report.\n- Do not invoke paid MT or AI engines without explicit authorization. Translate\n  strings yourself; free reuse of existing project wording is preferable.\n- Use the installed CLI's credential resolution. Credentials may be in\n  `~/.crowdin.yaml` or the environment. Never print credentials, include tokens\n  in command arguments, or write them into the repository, reports, or skill.\n  When API calls are necessary, load credentials privately into process memory\n  and use an Authorization header. Redact sensitive errors.\n- Never use generic `crowdin upload` or `just translations-upload` for this task:\n  they upload source files, not just the missing translations.\n\n## Workflow\n\n### 1. Discover live gaps\n\n1. Read repository instructions and `crowdin.yaml`; check `git status --short`.\n2. Check `crowdin --help` and relevant subcommand help for the installed version.\n   Verify access with `crowdin status --no-progress --no-colors`.\n3. Resolve the application file ID and requested languages using the live API.\n   Fetch source strings, including their context, identifiers, and plural data.\n4. Snapshot existing translations and approvals as needed for preservation\n   checks. Local `.ts` files can provide context, but they may be stale and their\n   unfinished counts are not authoritative Crowdin counts.\n5. Paginate API collections completely. A typical page size is 500; honor the\n   endpoint's actual limits. Keep a resumable submission log.\n\nUseful API v2 paths, relative to `https://api.crowdin.com/api/v2`:\n\n```text\nGET /projects/{projectId}\nGET /projects/{projectId}/files\nGET /projects/{projectId}/strings?fileId={fileId}\nGET /projects/{projectId}/languages/{languageId}/translations?fileId={fileId}\nGET /projects/{projectId}/translations?stringId={stringId}&languageId={languageId}\nGET /projects/{projectId}/files/{fileId}/languages/progress\n```\n\nThe language-translations endpoint returns plain `text` or a `plurals` array.\nIt can omit incompletely translated plural strings entirely. An absent entry\ntherefore does **not** prove that a string has no existing suggestions. Query\nthe string-translations endpoint before writing; for plurals, check each\n`pluralCategoryName` separately and preserve the categories already present.\nSkip hidden source strings unless explicitly requested.\n\n### 2. Reuse established translations\n\nIf authorized to write, first try perfect translation-memory matches for missing\napplication strings only. For the current CLI, the command is:\n\n```sh\ncrowdin pre-translate --method=tm --file=/QOwnNotes_en.ts \\\n  -l de -l zh-CN -l ru -l it -l pt-BR -l pl -l fr -l es-ES \\\n  --translate-untranslated-only --translate-with-perfect-match-only \\\n  --no-duplicate-translations --no-progress --no-colors\n```\n\nAdjust the languages and file path to the requested scope. Leave auto-approval\nunset. Refresh gaps afterward. Never assume that a successful TM job filled all\ngaps or that fuzzy matches are acceptable without review.\n\nAn existing translation of exactly the same source text can be reused if the\ncontexts have the same meaning and there are no conflicting translations. Do\nnot propagate ambiguous short labels blindly. Check the glossary and surrounding\nUI wording before writing new translations.\n\n### 3. Translate and validate\n\nWork in manageable batches and use source contexts and application code to\nresolve ambiguities. Preserve product names, commands, protocol names, and\nliteral examples unless localization is appropriate. Numeric bookmark slots can\nshare a reviewed translation template when only the slot number changes.\n\nBefore submission, check:\n\n- Qt placeholders, including `%1`, `%2`, `%L1`, `%n`, `%Ln`, `%v`, and `%m`.\n  Preserve their identities and multiplicity; allow grammatical reordering.\n- HTML tags, attributes, URLs, Markdown links, command-line flags, and constants\n  such as `QOWNNOTESAPI_MIN_VERSION`.\n- Meaningful line breaks, leading/trailing spaces used for concatenation, and\n  Qt `&` keyboard accelerators. Accelerators can move to a suitable letter.\n- Natural punctuation and ellipses for each locale. Chinese UI strings may need\n  `。` and `……` rather than English punctuation.\n- All plural categories required by the live language metadata, not merely the\n  categories present in the English source. In particular, Russian and Polish\n  also require `few` and `many`; preserve an existing `other` category as well.\n  Read `pluralCategoryNames` instead of hardcoding a universal category list.\n- Correct singular, plural, gender, and case. Do not copy English `(s)` notation\n  into natural translated plural forms or remove `%n` from singular forms.\n\n### 4. Submit missing entries only\n\nPrefer the CLI where it supports the operation safely. For individual missing\nstrings, the API avoids uploading whole catalogs or unrelated files:\n\n```text\nPOST /projects/{projectId}/translations\n{\n  \"stringId\": 123,\n  \"languageId\": \"fr\",\n  \"text\": \"...\",\n  \"pluralCategoryName\": \"one\"\n}\n```\n\nOmit `pluralCategoryName` for nonplural strings. Immediately before posting,\nrecheck existing suggestions for that string/language/category. Skip entries\nsomeone else has translated in the meantime. Do not approve the result.\n\nUse bounded concurrency, respect rate limits, and retry transient failures with\nbackoff. After an ambiguous POST failure, recheck whether the translation was\ncreated before retrying. Log language, string ID, plural category, submitted text,\nand returned translation ID. Resume from that log instead of duplicating work.\nDo not run overlapping upload batches for the same string/language/category.\n\nCrowdin's individual translation endpoint does not support editing text with a\nJSON Patch request. If one of **this task's own new submissions** needs correction,\nverify its ID and unchanged text, add the corrected suggestion, then remove only\nthat exact task-created suggestion. Log the replacement ID. Never delete a\npre-existing or externally edited translation.\n\n### 5. Verify and report\n\n1. Wait for all submitted batches to finish, then refetch effective translations\n   and application-file language progress.\n2. Verify that every active source string has all required translated categories,\n   all submitted placeholders remain valid, and pre-existing translations and\n   approvals are unchanged. Recheck partial plural strings explicitly.\n3. Review Crowdin QA warnings for the new translation IDs/categories. Product\n   names, German compounds, Chinese accelerator notation, and omitted English\n   `(s)` notation can cause false positives. Glossary checks may also mistake\n   parts of compounds or confuse a tab character with a UI tab. Fix real issues,\n   but do not distort valid translations or dismiss existing warnings.\n4. Confirm repository files remain unchanged unless changes were requested.\n5. Report live application-file completion for each language, any remaining gaps\n   or blockers, and that new entries await review. Do not equate \"100% translated\"\n   with \"100% approved\" or imply the website was translated.\n","frontmatter":{"name":"Crowdin Translations","description":"Translate missing QOwnNotes application strings directly in Crowdin for German, Simplified Chinese, Russian, Italian, Brazilian Portuguese, Polish, French, and Spanish while preserving existing translations."},"isInternal":false,"tokens":2034,"sizeBytes":9485},{"name":"copilot-instructions.md","path":".github/copilot-instructions.md","rawUrl":"https://raw.githubusercontent.com/pbek/QOwnNotes/HEAD/.github/copilot-instructions.md","title":"GitHub Copilot Instructions","category":"copilot-instructions","format":"markdown","content":"# QOwnNotes - GitHub Copilot Instructions\n\n## Project Overview\n\nQOwnNotes is an open source notepad with Markdown support and todo list manager for GNU/Linux, macOS, and Windows. It works together with Nextcloud Notes and ownCloud Notes.\n\n- **Language**: C++\n- **Framework**: Qt (supports both Qt5 and Qt6)\n- **Build Systems**:\n  - **qmake** (`.pro` files) - Primary build system\n  - **CMake** (`CMakeLists.txt`) - Alternative build system\n- **Task Runner**: just (justfile)\n\n## Building the Application\n\n### Quick Build (Recommended for Development)\n\nUse the `just` task runner to build the application:\n\n```bash\njust src-build\n```\n\nThis command will:\n\n1. Check qmake version\n2. Create the `build-QOwnNotes` directory\n3. Run qmake with debug configuration and system Botan\n4. Build using all available CPU cores with `make -j$(nproc)`\n\n### Alternative Build Commands\n\n- **Run tests**: `just src-test` (or `just test`)\n- **Clean build directory**: `just src-clean`\n- **Build and run**: `just src-build-run`\n- **Run built application**: `just src-run`\n\n### Building with Nix\n\nFor Nix users, multiple build options are available:\n\n- **Qt6 build**: `just nix-build` or `just nix-build-qt6`\n- **Qt5 build**: `just nix-build-qt5`\n- **Force rebuild**: `just nix-build-force`\n\n### Manual Build with CMake\n\nAlternatively, use CMake for building:\n\n```bash\nmkdir build && cd build\n\n# Configure with Qt6\ncmake ../src -DQON_QT6_BUILD=ON -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Or with Qt5 (default)\ncmake ../src -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Build\nmake -j4\n```\n\n**Available CMake Options:**\n\n- `QON_QT6_BUILD=ON` - Build with Qt6 (default: OFF, uses Qt5)\n- `DEV_MODE=ON` - Enable developer mode with extra warnings\n- `BUILD_WITH_LIBGIT2=ON` - Use system libgit2 library\n- `BUILD_WITH_ASPELL=ON` - Enable aspell spell checking support\n- `USE_QLITEHTML=ON` - Use QLiteHtml for preview\n- `CMAKE_BUILD_TYPE=Debug|Release` - Build type\n\nExample with multiple options:\n\n```bash\ncmake ../src \\\n  -DQON_QT6_BUILD=ON \\\n  -DDEV_MODE=ON \\\n  -DBUILD_WITH_LIBGIT2=ON \\\n  -DBUILD_WITH_ASPELL=ON \\\n  -DCMAKE_BUILD_TYPE=Debug\n```\n\n## Project Structure\n\n- `src/` - Main source code directory\n  - `QOwnNotes.pro` - Main qmake project file\n  - `CMakeLists.txt` - CMake build configuration\n  - `libraries/` - Third-party libraries (submodules)\n- `tests/` - Test files\n- `build-QOwnNotes/` - Default build directory (gitignored)\n- `justfile` - Task runner configuration\n- `scripts/` - Helper scripts\n- `docs/` - Documentation\n\n## Key Libraries & Dependencies\n\n### Required Qt Modules\n\n- Qt Core, GUI, Widgets, SQL, SVG, Network, XML\n- Qt PrintSupport, QML, WebSockets, Concurrent\n- Qt Quick (for Qt6, enables more scripting options)\n\n### Optional Dependencies\n\n- **Botan**: Cryptographic library (can use system or internal version)\n  - Default build uses system Botan: `USE_SYSTEM_BOTAN=1`\n- **Aspell**: Spell checking support\n- **QLiteHtml**: HTML rendering (optional, enable with `USE_QLITEHTML`)\n\n## Development Configuration\n\n### Build Modes (qmake)\n\n- **Debug Mode**: `CONFIG+=debug` - Includes debug symbols\n- **Dev Mode**: `CONFIG+=DEV_MODE` - Enables higher warning levels and precompiled headers\n- **Integration Tests**: `DEFINES+=INTEGRATION_TESTS` - For test builds\n\n### Build Modes (CMake)\n\n- **CMAKE_BUILD_TYPE=Debug** - Debug build with symbols\n- **CMAKE_BUILD_TYPE=Release** - Optimized release build\n- **DEV_MODE=ON** - Developer mode with extra warnings and -Werror on Linux\n- **INTEGRATION_TESTS** - For test builds\n\n### Common Configuration\n\nThe recommended development build uses:\n\n**qmake:**\n\n```bash\nqmake \"CONFIG+=debug USE_SYSTEM_BOTAN=1\" ../src/QOwnNotes.pro CONFIG+=DEV_MODE\n```\n\n**CMake:**\n\n```bash\ncmake ../src -DCMAKE_BUILD_TYPE=Debug -DDEV_MODE=ON\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\njust src-test\n```\n\nThis will:\n\n1. Build tests in `build-tests-QOwnNotes/` directory\n2. Run tests in minimal platform mode\n3. Clean up the test build directory\n\nFor VM tests (integration tests):\n\n```bash\njust vm-test\n```\n\n## Code Quality & Linting\n\n### Format Code\n\nFormat the entire project with clang-format:\n\n```bash\njust clang-format\n# Or aliases:\njust fix-linting\njust linter-fix\n```\n\n### Check Links\n\nValidate links in Markdown files:\n\n```bash\njust link-check\n```\n\n## Translation Workflow\n\n- **Download translations**: `just translations-download`\n- **Build translations**: `just translations-build`\n- **Upload to Crowdin**: `just translations-upload`\n- **Update translation files**: `just translations-update-files`\n\nTranslations are managed via Crowdin: https://crowdin.com/project/qownnotes\n\n## Important Notes for AI Assistants\n\n1. **Always use `just src-build` to build the project** - Don't try to run qmake/make directly unless specifically requested\n2. **Always use `just nix-build` to build the project when asked to use nix**\n3. **The project uses Qt/C++** - Be mindful of Qt's signal/slot mechanism, QObject lifecycle, and Qt-specific patterns\n4. **Submodules are used** - Libraries in `src/libraries/` are git submodules\n5. **Multiple Qt versions supported** - Code must work with both Qt5 and Qt6\n6. **Cross-platform** - Code must work on Linux, macOS, and Windows\n7. **Two build systems available** - Primary is qmake (`.pro` files), but CMake (`CMakeLists.txt`) is also supported\n8. **Development mode** - Use `CONFIG+=DEV_MODE` for qmake or `-DDEV_MODE=ON` for CMake in active development\n9. **Version bumping** - Update `src/version.h` and `src/build_number.h`, `BUILD` just needs to be increase by one\n10. **This project has translations** - They can be found in the `src/translations/` directory as `.ts` files\n\n## Minimum Requirements\n\n- Qt 5.5+ or Qt 6.0+\n- GCC 4.8+\n- Desktop operating system supporting Qt\n\n## Useful Resources\n\n- Website: https://www.qownnotes.org\n- Documentation: https://www.qownnotes.org/getting-started/concept.html\n- GitHub Issues: https://github.com/pbek/QOwnNotes/issues\n- Script Repository: https://github.com/qownnotes/scripts\n- Changelog: https://www.qownnotes.org/changelog.html\n\n## Quick Reference Commands\n\n```bash\n# Build and run\njust src-build-run\n\n# Run tests\njust test\n\n# Format code\njust clang-format\n\n# Clean build\njust src-clean\n\n# List all available commands\njust --list\n```\n","isInternal":false,"tokens":1675,"sizeBytes":6247}],"systemPromptSnippet":"<yakaai_skills repo=\"pbek/QOwnNotes\">\n<!-- File: AGENTS.md (Tokens: ~2306 | Category: root-instruction) -->\n# QOwnNotes - Agents Instructions\n\n## Project Overview\n\nQOwnNotes is an open source notepad with Markdown support and todo list manager for GNU/Linux, macOS, and Windows. It works together with Nextcloud Notes and ownCloud Notes.\n\n- **Language**: C++\n- **Framework**: Qt (supports both Qt5 and Qt6)\n- **Build Systems**:\n  - **qmake** (`.pro` files) - Primary build system\n  - **CMake** (`CMakeLists.txt`) - Alternative build system\n- **Task Runner**: just (justfile)\n\n## Building the Application\n\n### Quick Build (Recommended for Development)\n\nUse the `just` task runner to build the application:\n\n```bash\njust src-build\n```\n\nThis command will:\n\n1. Check qmake version\n2. Create the `build-QOwnNotes` directory\n3. Run qmake with debug configuration and system Botan\n4. Build using all available CPU cores with `make -j$(nproc)`\n\n### Alternative Build Commands\n\n- **Run tests**: `just src-test` (or `just test`)\n- **Clean build directory**: `just src-clean`\n- **Build and run**: `just src-build-run`\n- **Run built application**: `just src-run`\n\n### Building with Nix\n\nFor Nix users, multiple build options are available:\n\n- **Qt5 build**: `just nix-build-qt5`\n- **Qt6 with KDE integration (Linux)**: `just build` or `just nix-build`\n- **Plain Qt6 build**: `just nix-build-qt6`\n- **Force rebuild**: `just nix-build-force`\n\n### Manual Build with CMake\n\nAlternatively, use CMake for building:\n\n```bash\nmkdir build && cd build\n\n# Configure with Qt6\ncmake ../src -DQON_QT6_BUILD=ON -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Or with Qt5 (default)\ncmake ../src -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Build\nmake -j4\n```\n\n**Available CMake Options:**\n\n- `QON_QT6_BUILD=ON` - Build with Qt6 (default: OFF, uses Qt5)\n- `QON_KDE_INTEGRATION=ON` - Optional KDE Frameworks 6 integration (default: OFF,\n  Linux and Qt6 only; requires Extra CMake Modules, KColorScheme, KCoreAddons, KCrash, KGlobalAccel, KNotifications, KWindowSystem, Purpose, and PlasmaActivities)\n- `DEV_MODE=ON` - Enable developer mode with extra warnings\n- `BUILD_WITH_LIBGIT2=ON` - Use system libgit2 library\n- `BUILD_WITH_ASPELL=ON` - Enable aspell spell checking support\n- `USE_QLITEHTML=ON` - Use QLiteHtml for preview\n- `CMAKE_BUILD_TYPE=Debug|Release` - Build type\n\nExample with multiple options:\n\n```bash\ncmake ../src \\\n  -DQON_QT6_BUILD=ON \\\n  -DDEV_MODE=ON \\\n  -DBUILD_WITH_LIBGIT2=ON \\\n  -DBUILD_WITH_ASPELL=ON \\\n  -DCMAKE_BUILD_TYPE=Debug\n```\n\n## Project Structure\n\nFor the KDE integration roadmap and build instructions, see `docs/kde-integration.md`.\n`just src-build-kde` provides a CMake development recipe in a KDE-enabled environment;\nuse `just nix-build` for agent build validation.\n\n- `src/` - Main source code directory\n  - `QOwnNotes.pro` - Main qmake project file\n  - `CMakeLists.txt` - CMake build configuration\n  - `libraries/` - Third-party libraries (submodules)\n- `tests/` - Test files\n- `build-QOwnNotes/` - Default build directory (gitignored)\n- `justfile` - Task runner configuration\n- `scripts/` - Helper scripts\n- `docs/` - Documentation\n\n## Key Libraries & Dependencies\n\n### Required Qt Modules\n\n- Qt Core, GUI, Widgets, SQL, SVG, Network, XML\n- Qt PrintSupport, QML, WebSockets, Concurrent\n- Qt Quick (for Qt6, enables more scripting options)\n\n### Optional Dependencies\n\n- **Botan**: Cryptographic library (can use system or internal version)\n  - Default build uses system Botan: `USE_SYSTEM_BOTAN=1`\n- **Aspell**: Spell checking support\n- **QLiteHtml**: HTML rendering (optional, enable with `USE_QLITEHTML`)\n\n## Development Configuration\n\n### Build Modes (qmake)\n\n- **Debug Mode**: `CONFIG+=debug` - Includes debug symbols\n- **Dev Mode**: `CONFIG+=DEV_MODE` - Enables higher warning levels and precompiled headers\n\n### Build Modes (CMake)\n\n- **CMAKE_BUILD_TYPE=Debug** - Debug build with symbols\n- **CMAKE_BUILD_TYPE=Release** - Optimized release build\n- **DEV_MODE=ON** - Developer mode with extra warnings and -Werror on Linux\n\n### Common Configuration\n\nThe recommended development build uses:\n\n**qmake:**\n\n```bash\nqmake \"CONFIG+=debug USE_SYSTEM_BOTAN=1\" ../src/QOwnNotes.pro CONFIG+=DEV_MODE\n```\n\n**CMake:**\n\n```bash\ncmake ../src -DCMAKE_BUILD_TYPE=Debug -DDEV_MODE=ON\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\njust src-test\n```\n\nThis will:\n\n1. Build the unit tests with CMake and Qt6 in the `build-tests-QOwnNotes/` directory\n2. Run tests in minimal platform mode\n3. Clean up the test build directory\n\nThe unit tests are defined in `tests/CMakeLists.txt` (Qt6 only, the `INTEGRATION_TESTS` define is\nset there). To build and run them manually:\n\n```bash\ncmake -S tests -B build-tests -DCMAKE_BUILD_TYPE=Debug\ncmake --build build-tests --parallel\n./build-tests/bin/tests -platform minimal\n```\n\nWhen adding new test cases or application sources needed by the tests, add them to\n`tests/CMakeLists.txt`.\n\nFor VM tests (integration tests):\n\n```bash\njust vm-test\n```\n\n## Code Quality & Linting\n\n### Format Code\n\nFormat the entire project with clang-format:\n\n```bash\njust clang-format\n# Or aliases:\njust fix-linting\njust linter-fix\n```\n\n### Check Links\n\nValidate links in Markdown files:\n\n```bash\njust link-check\n```\n\n## Translation Workflow\n\n- **Download translations**: `just translations-download`\n- **Build translations**: `just translations-build`\n- **Upload to Crowdin**: `just translations-upload`\n- **Update translation files**: `just translations-update-files`\n- **Generate changelog line**: `just translations-changelog` (outputs a line like `- Added more ... translation (thank you, ...)`)\n\nTranslations are managed via Crowdin: https://crowdin.com/project/qownnotes\n\n## Important Notes for AI Assistants\n\n- **Always use `just nix-build` to build the project** - Don't try to run qmake/make directly unless specifically requested\n- **The project uses Qt/C++** - Be mindful of Qt's signal/slot mechanism, QObject lifecycle, and Qt-specific patterns\n- **Submodules are used** - Libraries in `src/libraries/` are git submodules\n- **Multiple Qt versions supported** - Code must work with both Qt 5.7+ and Qt6 (use Preprocessor Directives like `#if QT_VERSION < QT_VERSION_CHECK(5, 9, 0)` to handle differences)\n- **Cross-platform** - Code must work on Linux, macOS, and Windows\n- **Two build systems available** - Primary is qmake (`.pro` files), but CMake (`CMakeLists.txt`) is also supported\n- **Build projects** - The primary build project files are `src/QOwnNotes.pro` and `src/CMakeLists.txt`\n- **Development mode** - Use `CONFIG+=DEV_MODE` for qmake or `-DDEV_MODE=ON` for CMake in active development\n  -. **Version bumping** - Update `src/version.h` and `src/build_number.h`, `BUILD` just needs to be increase by one - Version format is `MAJOR.MINOR.PATCH` (e.g. `22.12.0`), build number is a separate integer that increments with each release - The MAJOR part is always the last two digits of the year of the release (e.g. `22` for 2022), - The MINOR part is the month of the release (e.g. `12` for December), - The PATCH part is a counter that starts at `0` and increments with each release in the same month\n  (e.g. `0` for the first release in December 2022, `1` for the second release in December 2022, etc.)\n- **Version bump commits** - Commit changes to `src/version.h` and `src/build_number.h` in their own separate commit with the exact message `release: bump version`. Do not include feature fixes, changelog entries, or other unrelated changes in that commit.\n- **This project has translations** - They can be found in the `src/translations/` directory as `.ts` files\n- **Comments** - Always write clear and concise comments for complex logic, especially when dealing with Qt-specific features, start comments with uppercase letters\n- **Changelog** - Update the changelog with each release, following the format in `CHANGELOG.md`\n- **Commit messages** - Follow the existing commit message style: short and descriptive, use a scope followed by a colon (e.g., `misc:`, `mainwindow:`, `tests:`, `ci:`), use imperative description after the colon (e.g., `fix`, `add`, `allow`, `update`, `refactor`), include issue number at the start when there is one (e.g., `#3568 mainwindow: allow dragging text file to import as note`). Keep commits focused so each commit represents one logical change.\n\n## Minimum Requirements\n\n- Qt 5.5+ or Qt 6.0+\n- GCC 4.8+\n- Desktop operating system supporting Qt\n\n## Useful Resources\n\n- Website: https://www.qownnotes.org\n- Documentation: https://www.qownnotes.org/getting-started/concept.html\n- GitHub Issues: https://github.com/pbek/QOwnNotes/issues\n- Script Repository: https://github.com/qownnotes/scripts\n- Changelog: https://www.qownnotes.org/changelog.html\n\n## Quick Reference Commands\n\n```bash\n# Build and run\njust src-build-run\n\n# Run tests\njust test\n\n# Format code\njust clang-format\n\n# Clean build\njust src-clean\n\n# List all available commands\njust --list\n```\n\n<!-- File: .opencode/skills/crowdin-translations/SKILL.md (Tokens: ~2034 | Category: anthropic-skill) -->\n---\nname: Crowdin Translations\ndescription: Translate missing QOwnNotes application strings directly in Crowdin for German, Simplified Chinese, Russian, Italian, Brazilian Portuguese, Polish, French, and Spanish while preserving existing translations.\n---\n\n# Crowdin translations\n\nUse this skill to fill missing application translations in the QOwnNotes Crowdin\nproject. Creating or updating this skill alone does not authorize submitting\ntranslations. Respect Plan mode and obtain authorization before remote writes\nwhen the user's request does not already authorize them.\n\n## Default languages and scope\n\nUnless the user selects a subset, use all eight languages:\n\n| Requested locale | Crowdin language ID | Local application catalog          |\n| ---------------- | ------------------- | ---------------------------------- |\n| `de_DE`          | `de`                | `src/languages/QOwnNotes_de.ts`    |\n| `zh_CN`          | `zh-CN`             | `src/languages/QOwnNotes_zh_CN.ts` |\n| `ru_RU`          | `ru`                | `src/languages/QOwnNotes_ru.ts`    |\n| `it_IT`          | `it`                | `src/languages/QOwnNotes_it.ts`    |\n| `pt_BR`          | `pt-BR`             | `src/languages/QOwnNotes_pt_BR.ts` |\n| `pl_PL`          | `pl`                | `src/languages/QOwnNotes_pl.ts`    |\n| `fr_FR`          | `fr`                | `src/languages/QOwnNotes_fr.ts`    |\n| `es_ES`          | `es-ES`             | `src/languages/QOwnNotes_es.ts`    |\n\nConfirm language IDs against the live project. Read `crowdin.yaml` for the project\nID and file mapping rather than assuming they never change. The application\nsource is currently `src/languages/QOwnNotes_en.ts`, mapped to `/QOwnNotes_en.ts`\nin Crowdin. Do not confuse it with website Markdown or browser-extension files.\n\nDefault to application strings only. Do not expand to the website, change source\nstrings, download translations into the repository, update release files, or\ncommit changes unless requested. Keep temporary scripts, snapshots, and reports\nin a unique task directory under `/tmp/opencode`.\n\n## Safety rules\n\n- Fill missing translations and missing plural categories only. Preserve all\n  existing suggestions, effective translations, and approvals, even if they have\n  QA warnings. Fixing existing translations is a separate task.\n- Submit new translations without approving them. Do not reset approvals, vote,\n  or mark QA warnings resolved just to obtain a clean report.\n- Do not invoke paid MT or AI engines without explicit authorization. Translate\n  strings yourself; free reuse of existing project wording is preferable.\n- Use the installed CLI's credential resolution. Credentials may be in\n  `~/.crowdin.yaml` or the environment. Never print credentials, include tokens\n  in command arguments, or write them into the repository, reports, or skill.\n  When API calls are necessary, load credentials privately into process memory\n  and use an Authorization header. Redact sensitive errors.\n- Never use generic `crowdin upload` or `just translations-upload` for this task:\n  they upload source files, not just the missing translations.\n\n## Workflow\n\n### 1. Discover live gaps\n\n1. Read repository instructions and `crowdin.yaml`; check `git status --short`.\n2. Check `crowdin --help` and relevant subcommand help for the installed version.\n   Verify access with `crowdin status --no-progress --no-colors`.\n3. Resolve the application file ID and requested languages using the live API.\n   Fetch source strings, including their context, identifiers, and plural data.\n4. Snapshot existing translations and approvals as needed for preservation\n   checks. Local `.ts` files can provide context, but they may be stale and their\n   unfinished counts are not authoritative Crowdin counts.\n5. Paginate API collections completely. A typical page size is 500; honor the\n   endpoint's actual limits. Keep a resumable submission log.\n\nUseful API v2 paths, relative to `https://api.crowdin.com/api/v2`:\n\n```text\nGET /projects/{projectId}\nGET /projects/{projectId}/files\nGET /projects/{projectId}/strings?fileId={fileId}\nGET /projects/{projectId}/languages/{languageId}/translations?fileId={fileId}\nGET /projects/{projectId}/translations?stringId={stringId}&languageId={languageId}\nGET /projects/{projectId}/files/{fileId}/languages/progress\n```\n\nThe language-translations endpoint returns plain `text` or a `plurals` array.\nIt can omit incompletely translated plural strings entirely. An absent entry\ntherefore does **not** prove that a string has no existing suggestions. Query\nthe string-translations endpoint before writing; for plurals, check each\n`pluralCategoryName` separately and preserve the categories already present.\nSkip hidden source strings unless explicitly requested.\n\n### 2. Reuse established translations\n\nIf authorized to write, first try perfect translation-memory matches for missing\napplication strings only. For the current CLI, the command is:\n\n```sh\ncrowdin pre-translate --method=tm --file=/QOwnNotes_en.ts \\\n  -l de -l zh-CN -l ru -l it -l pt-BR -l pl -l fr -l es-ES \\\n  --translate-untranslated-only --translate-with-perfect-match-only \\\n  --no-duplicate-translations --no-progress --no-colors\n```\n\nAdjust the languages and file path to the requested scope. Leave auto-approval\nunset. Refresh gaps afterward. Never assume that a successful TM job filled all\ngaps or that fuzzy matches are acceptable without review.\n\nAn existing translation of exactly the same source text can be reused if the\ncontexts have the same meaning and there are no conflicting translations. Do\nnot propagate ambiguous short labels blindly. Check the glossary and surrounding\nUI wording before writing new translations.\n\n### 3. Translate and validate\n\nWork in manageable batches and use source contexts and application code to\nresolve ambiguities. Preserve product names, commands, protocol names, and\nliteral examples unless localization is appropriate. Numeric bookmark slots can\nshare a reviewed translation template when only the slot number changes.\n\nBefore submission, check:\n\n- Qt placeholders, including `%1`, `%2`, `%L1`, `%n`, `%Ln`, `%v`, and `%m`.\n  Preserve their identities and multiplicity; allow grammatical reordering.\n- HTML tags, attributes, URLs, Markdown links, command-line flags, and constants\n  such as `QOWNNOTESAPI_MIN_VERSION`.\n- Meaningful line breaks, leading/trailing spaces used for concatenation, and\n  Qt `&` keyboard accelerators. Accelerators can move to a suitable letter.\n- Natural punctuation and ellipses for each locale. Chinese UI strings may need\n  `。` and `……` rather than English punctuation.\n- All plural categories required by the live language metadata, not merely the\n  categories present in the English source. In particular, Russian and Polish\n  also require `few` and `many`; preserve an existing `other` category as well.\n  Read `pluralCategoryNames` instead of hardcoding a universal category list.\n- Correct singular, plural, gender, and case. Do not copy English `(s)` notation\n  into natural translated plural forms or remove `%n` from singular forms.\n\n### 4. Submit missing entries only\n\nPrefer the CLI where it supports the operation safely. For individual missing\nstrings, the API avoids uploading whole catalogs or unrelated files:\n\n```text\nPOST /projects/{projectId}/translations\n{\n  \"stringId\": 123,\n  \"languageId\": \"fr\",\n  \"text\": \"...\",\n  \"pluralCategoryName\": \"one\"\n}\n```\n\nOmit `pluralCategoryName` for nonplural strings. Immediately before posting,\nrecheck existing suggestions for that string/language/category. Skip entries\nsomeone else has translated in the meantime. Do not approve the result.\n\nUse bounded concurrency, respect rate limits, and retry transient failures with\nbackoff. After an ambiguous POST failure, recheck whether the translation was\ncreated before retrying. Log language, string ID, plural category, submitted text,\nand returned translation ID. Resume from that log instead of duplicating work.\nDo not run overlapping upload batches for the same string/language/category.\n\nCrowdin's individual translation endpoint does not support editing text with a\nJSON Patch request. If one of **this task's own new submissions** needs correction,\nverify its ID and unchanged text, add the corrected suggestion, then remove only\nthat exact task-created suggestion. Log the replacement ID. Never delete a\npre-existing or externally edited translation.\n\n### 5. Verify and report\n\n1. Wait for all submitted batches to finish, then refetch effective translations\n   and application-file language progress.\n2. Verify that every active source string has all required translated categories,\n   all submitted placeholders remain valid, and pre-existing translations and\n   approvals are unchanged. Recheck partial plural strings explicitly.\n3. Review Crowdin QA warnings for the new translation IDs/categories. Product\n   names, German compounds, Chinese accelerator notation, and omitted English\n   `(s)` notation can cause false positives. Glossary checks may also mistake\n   parts of compounds or confuse a tab character with a UI tab. Fix real issues,\n   but do not distort valid translations or dismiss existing warnings.\n4. Confirm repository files remain unchanged unless changes were requested.\n5. Report live application-file completion for each language, any remaining gaps\n   or blockers, and that new entries await review. Do not equate \"100% translated\"\n   with \"100% approved\" or imply the website was translated.\n\n<!-- File: .github/copilot-instructions.md (Tokens: ~1675 | Category: copilot-instructions) -->\n# QOwnNotes - GitHub Copilot Instructions\n\n## Project Overview\n\nQOwnNotes is an open source notepad with Markdown support and todo list manager for GNU/Linux, macOS, and Windows. It works together with Nextcloud Notes and ownCloud Notes.\n\n- **Language**: C++\n- **Framework**: Qt (supports both Qt5 and Qt6)\n- **Build Systems**:\n  - **qmake** (`.pro` files) - Primary build system\n  - **CMake** (`CMakeLists.txt`) - Alternative build system\n- **Task Runner**: just (justfile)\n\n## Building the Application\n\n### Quick Build (Recommended for Development)\n\nUse the `just` task runner to build the application:\n\n```bash\njust src-build\n```\n\nThis command will:\n\n1. Check qmake version\n2. Create the `build-QOwnNotes` directory\n3. Run qmake with debug configuration and system Botan\n4. Build using all available CPU cores with `make -j$(nproc)`\n\n### Alternative Build Commands\n\n- **Run tests**: `just src-test` (or `just test`)\n- **Clean build directory**: `just src-clean`\n- **Build and run**: `just src-build-run`\n- **Run built application**: `just src-run`\n\n### Building with Nix\n\nFor Nix users, multiple build options are available:\n\n- **Qt6 build**: `just nix-build` or `just nix-build-qt6`\n- **Qt5 build**: `just nix-build-qt5`\n- **Force rebuild**: `just nix-build-force`\n\n### Manual Build with CMake\n\nAlternatively, use CMake for building:\n\n```bash\nmkdir build && cd build\n\n# Configure with Qt6\ncmake ../src -DQON_QT6_BUILD=ON -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Or with Qt5 (default)\ncmake ../src -DDEV_MODE=ON -DCMAKE_BUILD_TYPE=Debug\n\n# Build\nmake -j4\n```\n\n**Available CMake Options:**\n\n- `QON_QT6_BUILD=ON` - Build with Qt6 (default: OFF, uses Qt5)\n- `DEV_MODE=ON` - Enable developer mode with extra warnings\n- `BUILD_WITH_LIBGIT2=ON` - Use system libgit2 library\n- `BUILD_WITH_ASPELL=ON` - Enable aspell spell checking support\n- `USE_QLITEHTML=ON` - Use QLiteHtml for preview\n- `CMAKE_BUILD_TYPE=Debug|Release` - Build type\n\nExample with multiple options:\n\n```bash\ncmake ../src \\\n  -DQON_QT6_BUILD=ON \\\n  -DDEV_MODE=ON \\\n  -DBUILD_WITH_LIBGIT2=ON \\\n  -DBUILD_WITH_ASPELL=ON \\\n  -DCMAKE_BUILD_TYPE=Debug\n```\n\n## Project Structure\n\n- `src/` - Main source code directory\n  - `QOwnNotes.pro` - Main qmake project file\n  - `CMakeLists.txt` - CMake build configuration\n  - `libraries/` - Third-party libraries (submodules)\n- `tests/` - Test files\n- `build-QOwnNotes/` - Default build directory (gitignored)\n- `justfile` - Task runner configuration\n- `scripts/` - Helper scripts\n- `docs/` - Documentation\n\n## Key Libraries & Dependencies\n\n### Required Qt Modules\n\n- Qt Core, GUI, Widgets, SQL, SVG, Network, XML\n- Qt PrintSupport, QML, WebSockets, Concurrent\n- Qt Quick (for Qt6, enables more scripting options)\n\n### Optional Dependencies\n\n- **Botan**: Cryptographic library (can use system or internal version)\n  - Default build uses system Botan: `USE_SYSTEM_BOTAN=1`\n- **Aspell**: Spell checking support\n- **QLiteHtml**: HTML rendering (optional, enable with `USE_QLITEHTML`)\n\n## Development Configuration\n\n### Build Modes (qmake)\n\n- **Debug Mode**: `CONFIG+=debug` - Includes debug symbols\n- **Dev Mode**: `CONFIG+=DEV_MODE` - Enables higher warning levels and precompiled headers\n- **Integration Tests**: `DEFINES+=INTEGRATION_TESTS` - For test builds\n\n### Build Modes (CMake)\n\n- **CMAKE_BUILD_TYPE=Debug** - Debug build with symbols\n- **CMAKE_BUILD_TYPE=Release** - Optimized release build\n- **DEV_MODE=ON** - Developer mode with extra warnings and -Werror on Linux\n- **INTEGRATION_TESTS** - For test builds\n\n### Common Configuration\n\nThe recommended development build uses:\n\n**qmake:**\n\n```bash\nqmake \"CONFIG+=debug USE_SYSTEM_BOTAN=1\" ../src/QOwnNotes.pro CONFIG+=DEV_MODE\n```\n\n**CMake:**\n\n```bash\ncmake ../src -DCMAKE_BUILD_TYPE=Debug -DDEV_MODE=ON\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\njust src-test\n```\n\nThis will:\n\n1. Build tests in `build-tests-QOwnNotes/` directory\n2. Run tests in minimal platform mode\n3. Clean up the test build directory\n\nFor VM tests (integration tests):\n\n```bash\njust vm-test\n```\n\n## Code Quality & Linting\n\n### Format Code\n\nFormat the entire project with clang-format:\n\n```bash\njust clang-format\n# Or aliases:\njust fix-linting\njust linter-fix\n```\n\n### Check Links\n\nValidate links in Markdown files:\n\n```bash\njust link-check\n```\n\n## Translation Workflow\n\n- **Download translations**: `just translations-download`\n- **Build translations**: `just translations-build`\n- **Upload to Crowdin**: `just translations-upload`\n- **Update translation files**: `just translations-update-files`\n\nTranslations are managed via Crowdin: https://crowdin.com/project/qownnotes\n\n## Important Notes for AI Assistants\n\n1. **Always use `just src-build` to build the project** - Don't try to run qmake/make directly unless specifically requested\n2. **Always use `just nix-build` to build the project when asked to use nix**\n3. **The project uses Qt/C++** - Be mindful of Qt's signal/slot mechanism, QObject lifecycle, and Qt-specific patterns\n4. **Submodules are used** - Libraries in `src/libraries/` are git submodules\n5. **Multiple Qt versions supported** - Code must work with both Qt5 and Qt6\n6. **Cross-platform** - Code must work on Linux, macOS, and Windows\n7. **Two build systems available** - Primary is qmake (`.pro` files), but CMake (`CMakeLists.txt`) is also supported\n8. **Development mode** - Use `CONFIG+=DEV_MODE` for qmake or `-DDEV_MODE=ON` for CMake in active development\n9. **Version bumping** - Update `src/version.h` and `src/build_number.h`, `BUILD` just needs to be increase by one\n10. **This project has translations** - They can be found in the `src/translations/` directory as `.ts` files\n\n## Minimum Requirements\n\n- Qt 5.5+ or Qt 6.0+\n- GCC 4.8+\n- Desktop operating system supporting Qt\n\n## Useful Resources\n\n- Website: https://www.qownnotes.org\n- Documentation: https://www.qownnotes.org/getting-started/concept.html\n- GitHub Issues: https://github.com/pbek/QOwnNotes/issues\n- Script Repository: https://github.com/qownnotes/scripts\n- Changelog: https://www.qownnotes.org/changelog.html\n\n## Quick Reference Commands\n\n```bash\n# Build and run\njust src-build-run\n\n# Run tests\njust test\n\n# Format code\njust clang-format\n\n# Clean build\njust src-clean\n\n# List all available commands\njust --list\n```\n</yakaai_skills>"}