Compare commits

...
5761 Commits
Author SHA1 Message Date
github-actions[bot] 634e32620c Bump versions for v11.78 2026-09-14 11:32:07 +00:00
Lauri Ojansivu f40d29a6e5 Prepare v11.78 release 2026-09-14 14:30:32 +03:00
Lauri Ojansivu cc00713b2c Organize upcoming changes and refresh translation status according to changelog rules 2026-09-14 14:29:59 +03:00
Lauri Ojansivu b232abe1a0 Record dated Basque rule terminology repair and remaining grammar review 2026-09-14 14:27:51 +03:00
Lauri Ojansivu 2a22a42a96 Correct Basque rule archive and restoration terminology 2026-09-14 14:27:31 +03:00
Lauri Ojansivu a6da38e763 Document automatic Git menu merge and translation review progress 2026-09-14 14:26:42 +03:00
Lauri Ojansivu f23a18515a Automate orphan autostash recovery and merge origin in Git menu 2026-09-14 14:26:20 +03:00
Lauri Ojansivu ffde8e84ee Validate Basque rule action and date-field labels 2026-09-14 14:25:29 +03:00
Lauri Ojansivu 39f4f573d8 Document Git menu recovery in upcoming changelog 2026-09-14 14:24:29 +03:00
Lauri Ojansivu f665f7cdaf Guard Git menu operations and report interrupted pull cleanup failures 2026-09-14 14:24:18 +03:00
Lauri Ojansivu ec5a6464fc Merge remote-tracking branch 'origin/main' 2026-09-14 14:23:49 +03:00
Lauri Ojansivu 3ad3491f39 Update dated translation audit and upcoming review progress 2026-09-14 14:23:27 +03:00
Lauri Ojansivu 4c788beef0 Validate Basque date parent-task and standalone rule labels 2026-09-14 14:23:10 +03:00
Lauri Ojansivu 84514bb203 Record dated Basque impersonation translation review 2026-09-14 14:22:21 +03:00
Lauri Ojansivu f29c14def7 Validate Basque impersonation wording against dictionary and handler 2026-09-14 14:21:50 +03:00
Lauri Ojansivu 0443b18e38 Add Frappe responsiveness browser regression and upcoming notes 2026-09-14 14:21:21 +03:00
Lauri Ojansivu 670c203113 Stop Frappe Gantt chrome observer from rewriting identical labels 2026-09-14 14:20:56 +03:00
Lauri Ojansivu fb74726c9e Document full-width board views in upcoming changelog 2026-09-14 14:20:35 +03:00
Lauri Ojansivu fda197bb00 Use full available width for timeline and shared board report views 2026-09-14 14:20:23 +03:00
Lauri Ojansivu 74ecca7814 Record Basque date and webhook translation review progress 2026-09-14 14:19:59 +03:00
Lauri Ojansivu a076987c96 Validate Basque date activities upload outcomes and webhook labels 2026-09-14 14:17:24 +03:00
Lauri Ojansivu e35ba91dfd Update LDAP investigation and language picker changelog 2026-09-14 14:16:25 +03:00
Lauri Ojansivu dad65fb6c5 Verify LDAP issue 6692 through actual bind and user search methods
The latest 11.77 report still shows the undefined-index error fixed locally in 2c5cdd78a. Exercise service-account binding followed by user search with unset and configured filters, and prove failed binding cannot proceed to search. The separately reported oplog observer error is not established as the authentication cause.

Thanks to Nissulya and xet7 !

Fixes #6692,
2026-09-14 14:16:19 +03:00
Lauri Ojansivu c3ce54fa21 Show full-width language picker with separate language and region lines 2026-09-14 14:15:31 +03:00
Lauri Ojansivu 220a6beb69 Record Basque report and storage translation review progress 2026-09-14 14:14:23 +03:00
Lauri Ojansivu ea16ef95e4 Validate Basque team reports and storage migration messages 2026-09-14 14:13:58 +03:00
Lauri Ojansivu 1ee15661a3 Record Basque search terminology repair and review progress 2026-09-14 14:13:28 +03:00
Lauri Ojansivu 9910a2c138 Clarify Basque archived search status and validate operator instructions 2026-09-14 14:12:59 +03:00
Lauri Ojansivu de9da747a7 Record Basque rule and activity translation review progress 2026-09-14 14:12:19 +03:00
Lauri Ojansivu e34b55d698 Validate Basque rule fragments and activity settings 2026-09-14 14:11:54 +03:00
Lauri Ojansivu 251e352245 Record Basque archive translation fixes and review progress 2026-09-14 14:11:22 +03:00
Lauri Ojansivu 629577951a Clarify Basque archive activity terminology and validate instructions 2026-09-14 14:10:57 +03:00
Lauri Ojansivu f7a816eb22 Record Basque activity and Galician label review progress 2026-09-14 14:10:08 +03:00
Lauri Ojansivu 641062f8cd Validate Basque activity messages and Galician session labels 2026-09-14 14:09:46 +03:00
Lauri Ojansivu bceb89d928 Document activity placeholder repair and translation review progress 2026-09-14 14:09:02 +03:00
Lauri Ojansivu 888e0e6bcd Substitute activity message values through current translation API
Pass activity values as sprintf options and discard Spacebars helper metadata so card and sidebar feeds show actual titles and labels instead of literal percent placeholders. Preserve the security-aware viewer and sanitizing. Verify substitution using the real i18next formatter and register browser assertions for both feeds.
2026-09-14 14:08:37 +03:00
Lauri Ojansivu a5e111f910 Validate Galician repository and account translations 2026-09-14 14:07:04 +03:00
Lauri Ojansivu 30abbc9ae2 Record Galician scheduler translation review progress 2026-09-14 14:06:27 +03:00
Lauri Ojansivu d2780f0082 Validate Galician scheduler and migration threshold translations 2026-09-14 14:06:05 +03:00
Lauri Ojansivu 1ca33bf70f Record Galician subtask agreement and migration review progress 2026-09-14 14:05:25 +03:00
Lauri Ojansivu 01fa30d1c3 Fix Galician completed-subtask agreement and review migration steps 2026-09-14 14:04:56 +03:00
Lauri Ojansivu cfeeb65d46 Record Galician storage migration translation review progress 2026-09-14 14:04:10 +03:00
Lauri Ojansivu b71db72ab0 Validate Galician storage migrations and progress labels 2026-09-14 14:03:49 +03:00
Lauri Ojansivu 196b82d78c Record Galician S3 and migration translation review progress 2026-09-14 14:03:14 +03:00
Lauri Ojansivu 9683042c4e Validate Galician S3 settings and migration outcomes 2026-09-14 14:02:45 +03:00
Lauri Ojansivu 86dc493da9 Document historical mirror recovery in upcoming changelog 2026-09-14 14:02:10 +03:00
Lauri Ojansivu 44e3e1fd75 Recover unavailable mirror links from creation-date Wayback history
Bound attachment requests and defer long rate-limit cooldowns while preserving rate-limit state. Recover missing public links from the closest historical capture, retain provenance, and skip optional failures so remaining content synchronization continues.
2026-09-14 14:01:59 +03:00
Lauri Ojansivu f753dedd93 Record Galician migration and backup review progress 2026-09-14 14:00:13 +03:00
Lauri Ojansivu 4e3802901e Validate Galician migration retry and backup translations 2026-09-14 13:59:56 +03:00
Lauri Ojansivu 9e8d8da268 Document staged parallel mirror synchronization in upcoming changelog 2026-09-14 13:59:20 +03:00
Lauri Ojansivu 103e4dface Stage Git and archive sync before parallel destination mirroring
Synchronize Git to all active destinations before collecting source content. Reuse the local archive for concurrent destination processes, show combined per-mirror issue and release counters, and retain separate mirror-named logs. Stop content writes after archive failure and preserve restart checkpoints.
2026-09-14 13:58:58 +03:00
Lauri Ojansivu 587f4ec335 Record Galician received-card and scheduler translation repairs 2026-09-14 13:55:47 +03:00
Lauri Ojansivu cfc2480e54 Fix Galician received-card agreement and validate scheduled job labels 2026-09-14 13:55:27 +03:00
Lauri Ojansivu 927faa7215 Record Galician upload and accessibility review progress 2026-09-14 13:54:27 +03:00
Lauri Ojansivu f51c7439f9 Validate Galician upload and accessibility settings translations 2026-09-14 13:54:09 +03:00
Lauri Ojansivu b5ddb610a8 Update Galician diagnostic review progress 2026-09-14 13:53:41 +03:00
Lauri Ojansivu 8fbc620750 Validate Galician diagnostic and storage labels 2026-09-14 13:53:21 +03:00
Lauri Ojansivu 503ada2fbe Document LDAP optional-filter login repair and verification 2026-09-14 13:52:52 +03:00
Lauri Ojansivu 2c5cdd78a9 Handle unset optional LDAP user search filter
An unset LDAP_USER_SEARCH_FILTER was indexed after service-account binding, causing the reported undefined index TypeError instead of searching users. Preserve configured filters and reject invalid types explicitly.

Thanks to Nissulya and xet7 !

Fixes #6692,
2026-09-14 13:52:37 +03:00
Lauri Ojansivu 5b2ce8f6f3 Record Galician diagnostic and dictionary review progress 2026-09-14 13:51:54 +03:00
Lauri Ojansivu c6c3b90bef Clarify Galician V8 garbage overwrite diagnostic 2026-09-14 13:51:30 +03:00
Lauri Ojansivu 798e86ec68 Record Galician format translation review progress
Update dated evidence and exact counts while preserving unresolved dictionary and browser requirements.

Thanks to xet7 !
2026-09-14 13:48:33 +03:00
Lauri Ojansivu 1adfb3bec3 Validate Galician format instructions and request states
Retain 27 correct values preserving template tokens, space entities, spinner options and closed/resolved distinctions.

Thanks to xet7 !
2026-09-14 13:48:09 +03:00
Lauri Ojansivu 9d307d8518 Record Galician query translation review progress
Update dated evidence and exact counts while preserving remaining grammar and browser requirements.

Thanks to xet7 !
2026-09-14 13:47:29 +03:00
Lauri Ojansivu d2d90abf53 Validate Galician query syntax and troubleshooting instructions
Retain 30 correct values preserving shorthand, descending sort, period predicates and executable diagnostics.

Thanks to xet7 !
2026-09-14 13:47:04 +03:00
Lauri Ojansivu 414e846517 Record Galician entity translation review progress
Update dated evidence and exact counts, preserving remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 13:46:26 +03:00
Lauri Ojansivu c78c7f3c52 Validate Galician entity and search predicate labels
Retain 30 correct values preserving entity names, date sorting and ended versus overdue predicates.

Thanks to xet7 !
2026-09-14 13:45:57 +03:00
Lauri Ojansivu e410234e78 Record Galician reminder translation review progress
Update dated evidence and exact counts, preserving remaining grammar and browser verification.

Thanks to xet7 !
2026-09-14 13:45:23 +03:00
Lauri Ojansivu 92b911aa94 Validate Galician reminders and notification controls
Retain 30 correct values preserving due conditions, exact tokens, read-state scope and weekday names.

Thanks to xet7 !
2026-09-14 13:44:57 +03:00
Lauri Ojansivu fe022ff608 Record Galician date activity translation review
Update dated evidence and exact counts while preserving outstanding grammar and browser validation.

Thanks to xet7 !
2026-09-14 13:44:27 +03:00
Lauri Ojansivu 44ff8c566b Validate Galician date activities and placement labels
Retain 30 correct values preserving authentication settings, date interpolation and opposing placement directions.

Thanks to xet7 !
2026-09-14 13:44:02 +03:00
Lauri Ojansivu cb16fd4d30 Record Galician rule translation review progress
Update dated evidence and exact counts while preserving remaining agreement and browser requirements.

Thanks to xet7 !
2026-09-14 13:43:32 +03:00
Lauri Ojansivu 87b9e45fb1 Validate Galician rule actions and web metadata labels
Retain 30 correct values preserving check/uncheck scope, wildcard meaning, date actions and literal HTML/JSON configuration names.

Thanks to xet7 !
2026-09-14 13:43:09 +03:00
Lauri Ojansivu 9530e99ea9 Record Galician custom-field activity repair progress
Update dated repair evidence and exact counts, retaining remaining grammar and browser verification.

Thanks to xet7 !
2026-09-14 13:42:35 +03:00
Lauri Ojansivu 29f1980b24 Clarify Galician custom-field value clearing activity
Describe removing the card field value rather than deleting its definition. Retain 25 correct rule and activity values, preserve percent placeholders and add positive/negative regression checks.

Thanks to xet7 !
2026-09-14 13:42:06 +03:00
Lauri Ojansivu 7f47bbf7f3 Record Galician permission translation review progress
Update dated evidence and exact counts while preserving unresolved agreement and browser requirements.

Thanks to xet7 !
2026-09-14 13:40:56 +03:00
Lauri Ojansivu dda51a1e5c Validate Galician account permissions and subtask settings
Retain 28 correct values preserving metadata, roles, notification scope and subtask path relationships. Leave received-label agreement open.

Thanks to xet7 !
2026-09-14 13:40:23 +03:00
Lauri Ojansivu 0b154538d3 Document compact release-note sections in Upcoming
Record the requested section whitelist and verification.

Thanks to xet7 !
2026-09-14 13:39:52 +03:00
Lauri Ojansivu f7def463be Restrict release notes to summary security and language updates
Emit only In short, Security, translation language names, thanks and the exact changelog anchor. Keep other details in the changelog and verify security retention, omitted developer entries and version-specific links offline.

Thanks to xet7 !
2026-09-14 13:39:32 +03:00
Lauri Ojansivu 6e9c26d53b Record Galician diagnostic translation review progress
Update dated evidence and exact counts while preserving remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 13:37:55 +03:00
Lauri Ojansivu 6c534f40f6 Validate Galician SMTP and system diagnostic labels
Retain 30 correct values preserving WIP remedies, webhook scope, invitation tokens and diagnostic distinctions.

Thanks to xet7 !
2026-09-14 13:37:22 +03:00
Lauri Ojansivu 55a8bb26ca Record Galician shortcut translation review progress
Update dated evidence and exact counts, preserving outstanding language and browser requirements.

Thanks to xet7 !
2026-09-14 13:36:56 +03:00
Lauri Ojansivu 64a60f1897 Validate Galician shortcuts and custom branding labels
Retain 30 correct values preserving units, limits, shortcut actions and URL configuration distinctions.

Thanks to xet7 !
2026-09-14 13:36:34 +03:00
Lauri Ojansivu 1709b89e7b Record Galician selection translation review progress
Update dated evidence and exact counts while retaining outstanding grammar and browser validation.

Thanks to xet7 !
2026-09-14 13:36:06 +03:00
Lauri Ojansivu 885d65b3b8 Validate Galician selection and board-management labels
Retain 30 correct values preserving selection scope, role restrictions, login-link interpolation and image-only input.

Thanks to xet7 !
2026-09-14 13:35:43 +03:00
Lauri Ojansivu d07cc31d21 Record Galician filter translation review progress
Update dated evidence and exact counts, retaining outstanding grammar and browser requirements.

Thanks to xet7 !
2026-09-14 13:35:14 +03:00
Lauri Ojansivu c45e99b02b Validate Galician filters and import mapping labels
Retain 30 correct values preserving date ranges, list visibility, import formats and existing-user mapping.

Thanks to xet7 !
2026-09-14 13:34:48 +03:00
Lauri Ojansivu 88fa9f5461 Record Galician email translation review progress
Update dated evidence and exact counts, retaining unresolved contextual and browser requirements.

Thanks to xet7 !
2026-09-14 13:33:59 +03:00
Lauri Ojansivu ac0f8696fa Validate Galician account emails and export fields
Retain 29 correct values preserving email purposes, placeholders, export roles and attachment metadata.

Thanks to xet7 !
2026-09-14 13:33:18 +03:00
Lauri Ojansivu d3afacd15f Record Galician custom-field translation review progress
Update dated evidence and exact counts, preserving outstanding grammar and browser validation.

Thanks to xet7 !
2026-09-14 13:32:45 +03:00
Lauri Ojansivu 98c90fd8a6 Validate Galician custom fields and access labels
Retain 30 correct values preserving access restrictions, field types, dropdown alternatives and email interpolation.

Thanks to xet7 !
2026-09-14 13:32:20 +03:00
Lauri Ojansivu 3fb32bc4b5 Record Galician estimation translation review progress
Update dated evidence and exact counts while preserving remaining language and browser validation.

Thanks to xet7 !
2026-09-14 13:31:39 +03:00
Lauri Ojansivu 47fb0f2771 Validate Galician estimation controls and color labels
Retain 30 correct values preserving named features, automatic-width inversion and color distinctions.

Thanks to xet7 !
2026-09-14 13:31:11 +03:00
Lauri Ojansivu 51d025e131 Record Galician calendar translation review progress
Update dated evidence and counts, retaining outstanding language and browser requirements.

Thanks to xet7 !
2026-09-14 13:30:42 +03:00
Lauri Ojansivu e5e09f52c8 Validate Galician calendar and voting labels
Retain 30 correct values preserving date directions, voting scope and permanent deletion warnings.

Thanks to xet7 !
2026-09-14 13:30:19 +03:00
Lauri Ojansivu 31786d7574 Record Galician display translation review progress
Update dated evidence and exact counts while preserving outstanding language and browser validation.

Thanks to xet7 !
2026-09-14 13:29:52 +03:00
Lauri Ojansivu 708478423a Validate Galician display settings and archive controls
Retain 30 correct values preserving units, archive scope, avatar tokens and zoom directions.

Thanks to xet7 !
2026-09-14 13:29:29 +03:00
Lauri Ojansivu 00c917ab39 Record Galician activity translation review progress
Update dated evidence and exact counts, retaining outstanding fluency and browser requirements.

Thanks to xet7 !
2026-09-14 13:29:00 +03:00
Lauri Ojansivu 4b926a60fa Validate Galician activities and workspace controls
Retain 35 correct values preserving activity directions, date tokens, workspace settings and shortcut state inversions.

Thanks to xet7 !
2026-09-14 13:28:34 +03:00
Lauri Ojansivu 829fb2ae9d Record Galician migration execution translation review
Update dated evidence and exact counts; preserve outstanding language and browser verification.

Thanks to xet7 !
2026-09-14 13:28:03 +03:00
Lauri Ojansivu e8766c17b9 Validate Galician migration execution and account messages
Retain 30 correct values preserving background behavior, batch limits, attachment states and account validation.

Thanks to xet7 !
2026-09-14 13:27:41 +03:00
Lauri Ojansivu 81ed6d9899 Document language-only translation release notes
Record summary behavior and offline verification under Upcoming.

Thanks to xet7 !
2026-09-14 13:27:11 +03:00
Lauri Ojansivu 8db16132cb Summarize release-note translations as updated languages
Keep detailed translation entries in the changelog and audit, but list only affected languages in release notes. Require explicit language metadata, preserve other topic details, and anchor release heading extraction. Verify nested detail removal and missing-metadata failure offline.

Thanks to xet7 !
2026-09-14 13:26:55 +03:00
Lauri Ojansivu a187b70013 Record Galician migration translation review progress
Update dated evidence and exact counts while preserving open completion terminology and browser requirements.

Thanks to xet7 !
2026-09-14 13:25:13 +03:00
Lauri Ojansivu ff77543b5c Validate Galician migration scopes and confirmations
Retain 34 correct values preserving archive restrictions, duplicate-list conditions, administrator-only execution and migration progress.

Thanks to xet7 !
2026-09-14 13:24:53 +03:00
Lauri Ojansivu 72abc938dd Record Galician account and scheduling review progress
Update dated exact counts and remaining ambiguous terminology requirements.

Thanks to xet7 !
2026-09-14 13:24:23 +03:00
Lauri Ojansivu 3b524f0712 Validate Galician account states and scheduled board actions
Retain 29 correct values preserving activation, unlock scope and scheduling success versus execution. Leave Complete wording open pending context.

Thanks to xet7 !
2026-09-14 13:23:57 +03:00
Lauri Ojansivu fd170dfc32 Record Galician storage translation review progress
Update dated evidence and resolve visibility-label context while preserving remaining validation scope.

Thanks to xet7 !
2026-09-14 13:23:33 +03:00
Lauri Ojansivu 2f141de75b Validate Galician storage and account-lockout labels
Retain 30 correct values preserving attachment scope, storage names, account states and visibility settings. Resolve card-show-lists context against the settings row and toggle.

Thanks to xet7 !
2026-09-14 13:23:08 +03:00
Lauri Ojansivu 4b82dd70fb Document changelog-only release notes in Upcoming
Record the release-note fix, validation and preserved separate provenance artifacts.

Thanks to xet7 !
2026-09-14 13:22:38 +03:00
Lauri Ojansivu ccfceb7b77 Exclude binary provenance tables from release notes
Generate initial and refreshed release notes solely from the changelog. Retain checksum verification and build provenance artifacts separately. Update build entry points, release instructions and regression guards.

Thanks to xet7 !
2026-09-14 13:22:19 +03:00
Lauri Ojansivu 263da8892d Record Galician predicate translation review progress
Update dated evidence and remaining contextual review requirements.

Thanks to xet7 !
2026-09-14 13:20:49 +03:00
Lauri Ojansivu f22aeb7bcd Validate Galician search predicates and checklist instructions
Retain 39 correct values preserving boolean search logic, deletion constraints, checklist order and legal-notice agreement. Leave card-show-lists context open.

Thanks to xet7 !
2026-09-14 13:20:19 +03:00
Lauri Ojansivu 7672a79147 Record Galician search translation review progress
Update dated review evidence and exact counts while retaining remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 13:19:50 +03:00
Lauri Ojansivu cf1e89bb9e Validate Galician search results and operator instructions
Retain 40 correct values preserving query syntax, role alternatives, date thresholds and result interpolation.

Thanks to xet7 !
2026-09-14 13:19:28 +03:00
Lauri Ojansivu 93ea560109 Record Galician deletion and card-view review progress
Update dated evidence and exact review counts, preserving outstanding grammar and browser validation.

Thanks to xet7 !
2026-09-14 13:18:59 +03:00
Lauri Ojansivu 2cb3f6b13f Validate Galician deletion warnings and personal card views
Retain 34 correct values, preserving irreversible effects, linked-card deletion order, mention placeholders and due-card permission restrictions.

Thanks to xet7 !
2026-09-14 13:18:38 +03:00
Lauri Ojansivu f8bb9f02f7 Record Galician date-trigger repairs and grammar finding
Update dated progress, source commit and remaining contextual agreement requirements.

Thanks to xet7 !
2026-09-14 13:18:14 +03:00
Lauri Ojansivu 54fdfd33ca Repair Galician automation date-trigger meanings
Replace Portuguese date wording and preserve both setting and changing dates. Retain 39 correct automation and HTML-placement values; leave attachment participle agreement open after inspecting assembled controls. Add positive and negative date-trigger regression checks.

Thanks to xet7 !
2026-09-14 13:17:47 +03:00
Lauri Ojansivu 6100709231 Record Galician card settings translation review progress
Update dated review evidence and exact counts while retaining outstanding language and browser validation.

Thanks to xet7 !
2026-09-14 13:16:37 +03:00
Lauri Ojansivu edea4b20e1 Validate Galician card settings and automation labels
Retain 25 correct translations after checking parent relationships, subtask destinations, attachment counts, activity interpolation and automation action scope.

Thanks to xet7 !
2026-09-14 13:16:13 +03:00
Lauri Ojansivu 0a43570fc8 Record Galician visibility translation review progress
Update dated review hash and exact counts, preserving remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 13:14:09 +03:00
Lauri Ojansivu e74cc64642 Validate Galician visibility and deletion warnings
Retain twenty-five correct values, preserving private-only scope, field application distinctions, invitation tokens and irreversible deletion warnings.

Thanks to xet7 !
2026-09-14 13:13:40 +03:00
Lauri Ojansivu 115901a7c8 Record Galician removal and shortcut translation review
Update dated review hash and exact counts while preserving all remaining audit and browser requirements.

Thanks to xet7 !
2026-09-14 13:13:08 +03:00
Lauri Ojansivu 4f0293f5cd Validate Galician removal and card-shortcut labels
Retain twenty-five correct translations, preserving member-removal effects, unsaved-description warnings, thresholds and self-assignment distinctions.

Thanks to xet7 !
2026-09-14 13:12:44 +03:00
Lauri Ojansivu 91c36f1cea Record Galician import-mapping and privacy translation review
Update dated review hash and exact counts while preserving remaining full audit and browser scope.

Thanks to xet7 !
2026-09-14 13:12:13 +03:00
Lauri Ojansivu 7f7db419c7 Validate Galician import mapping and board privacy descriptions
Retain twenty-five correct translations, preserving admin constraints, mapping fallback, notification scope and public versus private access.

Thanks to xet7 !
2026-09-14 13:11:37 +03:00
Lauri Ojansivu b6403e798e Record Galician import-help translation repair
Update dated repair hash and exact counts while preserving remaining full language and browser audit scope.

Thanks to xet7 !
2026-09-14 13:11:10 +03:00
Lauri Ojansivu 316232f694 Preserve Trello navigation labels in Galician import help
Retain Galician prose and twenty-nine correct template, invitation, export and filter labels. Preserve literal JSON properties and interpolation.

Thanks to xet7 !
2026-09-14 13:10:42 +03:00
Lauri Ojansivu 0233b49593 Record Galician role-description translation review
Update dated review hash and exact counts, preserving remaining full language and browser audit scope.

Thanks to xet7 !
2026-09-14 13:10:03 +03:00
Lauri Ojansivu 96367d2134 Validate Galician role descriptions and card controls
Retain twenty-five correct translations, preserving assigned-only visibility, editing restrictions and worker self-assignment scope.

Thanks to xet7 !
2026-09-14 13:09:36 +03:00
Lauri Ojansivu c8adbff586 Record Galician deletion-warning translation review
Update dated review hash and exact counts while preserving remaining audit and browser requirements.

Thanks to xet7 !
2026-09-14 13:08:58 +03:00
Lauri Ojansivu 4c585a2b81 Validate Galician deletion warnings and archive guidance
Retain twenty-five correct values, preserving permanent deletion versus reversible archive behavior and activity-loss warnings.

Thanks to xet7 !
2026-09-14 13:08:36 +03:00
Lauri Ojansivu 646ab17f46 Record Galician board-settings translation review
Update dated review hash and exact counts, preserving full remaining audit and browser scope.

Thanks to xet7 !
2026-09-14 13:08:04 +03:00
Lauri Ojansivu 68277a708d Validate Galician board settings and archive controls
Retain twenty-five correct translations, preserving member and assignee scopes, public/private distinctions and HTML emphasis.

Thanks to xet7 !
2026-09-14 13:07:41 +03:00
Lauri Ojansivu e55898711f Record Galician creation-control translation review
Update dated review hash and exact counts while preserving all unresolved language and browser requirements.

Thanks to xet7 !
2026-09-14 13:07:13 +03:00
Lauri Ojansivu f1add7ab2b Validate Galician creation controls and offline warning
Retain twenty-five correct translations, preserving placement, privilege scope, count agreement and data-loss conditions.

Thanks to xet7 !
2026-09-14 13:06:49 +03:00
Lauri Ojansivu 36b0109fc3 Record Galician membership and movement translation review
Update dated review hash and exact counts while preserving unresolved language and browser verification.

Thanks to xet7 !
2026-09-14 13:06:22 +03:00
Lauri Ojansivu b82f539a41 Validate Galician membership and card-movement activities
Retain twenty-five correct archive, import, movement and checklist values, preserving direction and exact interpolation.

Thanks to xet7 !
2026-09-14 13:05:59 +03:00
Lauri Ojansivu 2998b14bc2 Record Galician activity translation review progress
Update dated review hash and exact counts while preserving uncertain Esperanto findings and full remaining language/browser scope.

Thanks to xet7 !
2026-09-14 13:05:31 +03:00
Lauri Ojansivu 0d2e977d90 Validate Galician card and checklist activity translations
Retain twenty-five correct activity values, preserving action distinctions, object relationships and exact placeholders.

Thanks to xet7 !
2026-09-14 13:05:08 +03:00
Lauri Ojansivu 0b8f090343 Record Esperanto overtime terminology repair and evidence limits
Update dated repair hash and counts, distinguishing work classification from deadline expiry and retaining broader fluency review.

Thanks to xet7 !
2026-09-14 13:04:34 +03:00
Lauri Ojansivu 9b6b1ffe6f Clarify Esperanto overtime work labels
Use consistent overtime-work terminology for manually classified recorded hours, preserving the hours unit and separating this flag from due-date expiry.

Thanks to xet7 !
2026-09-14 13:04:06 +03:00
Lauri Ojansivu 11ac7f8a97 Record Esperanto advanced-filter translation repair
Update dated repair hash, exact counts and parser evidence while preserving wider language and browser review requirements.

Thanks to xet7 !
2026-09-14 13:03:28 +03:00
Lauri Ojansivu 5d94f1b92b Repair Esperanto advanced-filter examples and escaping instructions
Preserve canonical query examples and explain literal special-character escaping. Add positive example and negative malformed-wording coverage.

Thanks to xet7 !
2026-09-14 13:03:02 +03:00
Lauri Ojansivu e520065604 Record confirmed Esperanto scrollbar terminology
Update dated review hash and primary-source evidence, retaining unresolved color and broader audit requirements.

Thanks to xet7 !
2026-09-14 13:02:10 +03:00
Lauri Ojansivu 41fb26dff6 Validate Esperanto scrollbar terminology against computing references
Retain the correct vertical scrollbar translation; primary terminology and LibreOffice documentation confirm rulumskalo.

Thanks to xet7 !
2026-09-14 13:01:46 +03:00
Lauri Ojansivu c91ef98426 Record Esperanto garbage-zapping terminology repair
Update dated repair hash, official API evidence and exact counts while keeping remaining translation review open.

Thanks to xet7 !
2026-09-14 13:01:18 +03:00
Lauri Ojansivu 05217bbb9e Correct Esperanto heap garbage-zapping diagnostic
Describe overwriting heap garbage with a bit pattern rather than zeroing it, matching official Node V8 documentation.

Thanks to xet7 !
2026-09-14 13:00:52 +03:00
Lauri Ojansivu d8fd82d57d Record Esperanto remaining-label review progress
Update dated review hash and exact counts; explicitly preserve nine uncertain Esperanto findings and wider audit scope.

Thanks to xet7 !
2026-09-14 13:00:18 +03:00
Lauri Ojansivu f523001c3e Validate Esperanto account outcomes and remaining basic labels
Retain ten correct labels, preserving account creation success versus failure and login versus logout distinctions.

Thanks to xet7 !
2026-09-14 12:59:51 +03:00
Lauri Ojansivu ccafc4db96 Record Esperanto repository translation review progress
Update dated review hash and counts, preserving all remaining language and browser audit requirements.

Thanks to xet7 !
2026-09-14 12:59:23 +03:00
Lauri Ojansivu 9ba7cfcb80 Validate Esperanto repository and authentication labels
Retain thirty correct values, preserving temporary lockout conditions, required credentials, minimum length and byte units.

Thanks to xet7 !
2026-09-14 12:58:58 +03:00
Lauri Ojansivu 545e1bc9fb Record Esperanto scheduling translation review progress
Update dated review hash and exact counts; group upcoming translation entries and preserve open verification requirements.

Thanks to xet7 !
2026-09-14 12:58:32 +03:00
Lauri Ojansivu 5a398d5acc Validate Esperanto scheduling intervals and diagnostics
Retain thirty correct restoration, resource and scheduling labels, preserving interval quantities, singular/plural agreement and percent units.

Thanks to xet7 !
2026-09-14 12:57:52 +03:00
Lauri Ojansivu 44a6f7e74a Record Esperanto migration-confirmation review progress
Update dated review hash and counts, preserving unresolved meanings and full remaining audit scope.

Thanks to xet7 !
2026-09-14 12:57:26 +03:00
Lauri Ojansivu 07756eecd0 Validate Esperanto migration confirmations and steps
Retain thirty correct warnings and progress labels, preserving operation order, archived versus nonarchived scope and difficult-undo warnings.

Thanks to xet7 !
2026-09-14 12:57:00 +03:00
Lauri Ojansivu ba489652ec Record Esperanto migration-description review progress
Update dated review hash, exact counts and unresolved completion-label evidence without closing remaining audit scope.

Thanks to xet7 !
2026-09-14 12:56:33 +03:00
Lauri Ojansivu 036cbff311 Validate Esperanto migration repair descriptions
Retain nineteen correct restoration and data-integrity labels, preserving field identifiers, board scope and administrator-only permission. Leave Complete state terminology under review.

Thanks to xet7 !
2026-09-14 12:56:08 +03:00
Lauri Ojansivu aa0ae67f83 Record Esperanto storage and migration review progress
Update dated review hash and exact counts while preserving remaining translation and browser requirements.

Thanks to xet7 !
2026-09-14 12:55:32 +03:00
Lauri Ojansivu 460df4ada0 Validate Esperanto storage and migration settings
Retain thirty correct values, preserving conjunctive duplicate-list safety conditions and distinct migration actions and connection outcomes.

Thanks to xet7 !
2026-09-14 12:55:10 +03:00
github-actions[bot] 605c6caf41 Bump versions for v11.77 2026-09-14 09:55:00 +00:00
Lauri Ojansivu 25ed0a5ccb Record Esperanto scheduled-job translation review progress
Update dated review hash and counts, preserving released v11.77 notes and recording new work under Upcoming.

Thanks to xet7 !
2026-09-14 12:54:44 +03:00
Lauri Ojansivu 8b0d7488ad Prepare v11.77 release 2026-09-14 12:53:36 +03:00
Lauri Ojansivu 5946767b1f Validate Esperanto scheduled-job and migration labels
Retain twenty-nine correct administration values, preserving failed versus paused states and success versus failure outcomes. Leave context-dependent Complete under review.

Thanks to xet7 !
2026-09-14 12:53:34 +03:00
Lauri Ojansivu 0f29a984da Record Esperanto account-window translation repair
Update dated local repair hash, exact counts and evidence while preserving remaining language and browser review.

Thanks to xet7 !
2026-09-14 12:53:00 +03:00
Lauri Ojansivu 6eaabcaeaa Clarify Esperanto login-failure time window
Distinguish the time window for failed attempts from an unsuccessful window. Retain twenty-nine correct support, accessibility and account-state labels.

Thanks to xet7 !
2026-09-14 12:52:34 +03:00
Lauri Ojansivu 26013dc670 Record Esperanto attachment translation review progress
Update dated review hash and exact counts, preserving remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 12:51:48 +03:00
Lauri Ojansivu 1439290a60 Validate Esperanto attachment and custom-translation labels
Retain thirty correct storage, upload, authentication and custom-translation strings, preserving byte units and irreversible deletion warnings.

Thanks to xet7 !
2026-09-14 12:51:21 +03:00
Lauri Ojansivu 0a5b46b0fb Record Esperanto RSS repair and technical terminology review
Update dated repair hash, exact counts and dictionary evidence; keep uncertain memory and wider language/browser validation open.

Thanks to xet7 !
2026-09-14 12:50:55 +03:00
Lauri Ojansivu 3e0c49da97 Restore size meaning in Esperanto RSS diagnostic
Clarify resident set size and retain twenty-eight correct memory, legal and checklist labels. Preserve documented native terminology; garbage-zapping wording remains under review.

Thanks to xet7 !
2026-09-14 12:50:28 +03:00
Lauri Ojansivu 4e22307ef9 Document private-only board insertion policy follow-up
Add upcoming changelog entry and dated remediation evidence with the local implementation commit and verification limits.

Thanks to xet7 !
2026-09-14 12:49:47 +03:00
Lauri Ojansivu 749467c802 Enforce private-only policy for trusted board insertions
Apply the instance visibility policy at the shared before-insert hook so copies, imports and lazy helpers cannot create public boards. Keep policy enforcement independent of security logger availability.

Thanks to xet7 !
2026-09-14 12:49:30 +03:00
Lauri Ojansivu 71084bbef2 Record Esperanto request and spinner translation review
Update dated review hash, exact progress counts and evidence without closing remaining language or browser verification.

Thanks to xet7 !
2026-09-14 12:48:16 +03:00
Lauri Ojansivu 59ad2ce12a Validate Esperanto request states and spinner labels
Retain thirty correct separator, swimlane, spinner and request translations, preserving literal space entities and organization deletion constraints.

Thanks to xet7 !
2026-09-14 12:47:57 +03:00
Lauri Ojansivu e62d364229 Record Esperanto search instruction audit progress
Update dated review hash and exact counts, noting shared source formatting separately from translation errors.

Thanks to xet7 !
2026-09-14 12:47:31 +03:00
Lauri Ojansivu bc927c112c Validate Esperanto search instructions and sorting labels
Retain thirty correct translations, preserving query examples, interpolation, integer rules and sorting direction.

Thanks to xet7 !
2026-09-14 12:47:11 +03:00
Lauri Ojansivu 1f08e395f2 Record Esperanto search validation review progress
Update dated commit, exact review counts and evidence while preserving remaining translation scope.

Thanks to xet7 !
2026-09-14 12:46:41 +03:00
Lauri Ojansivu 18cf8b11bb Validate Esperanto search operators and errors
Retain forty correct search display labels, validation errors and pagination translations, preserving positive-integer requirements and exact interpolation.

Thanks to xet7 !
2026-09-14 12:46:23 +03:00
Lauri Ojansivu eb592680b0 Record Esperanto due-card and search audit progress
Update dated review commit and exact counts while preserving the full remaining translation review scope.

Thanks to xet7 !
2026-09-14 12:45:53 +03:00
Lauri Ojansivu 53044af0bb Validate Esperanto due-card and search labels
Retain forty-five correct weekdays, task states, due-card permission descriptions and search labels, preserving negation and interpolation.

Thanks to xet7 !
2026-09-14 12:45:34 +03:00
Lauri Ojansivu 96623d8651 Record Esperanto reminder and notification review progress
Update dated local review hash, exact counts and evidence while keeping all remaining translation verification open.

Thanks to xet7 !
2026-09-14 12:45:11 +03:00
Lauri Ojansivu 35792c787d Validate Esperanto reminders and notification controls
Retain forty correct date activity, placement, deletion warning, assignee and notification translations after direct semantic review.

Thanks to xet7 !
2026-09-14 12:44:52 +03:00
Lauri Ojansivu 11c667884b Record Esperanto completion validation with corrected dictionary provenance
Update dated review counts and preserve remaining language and browser audit requirements.

Thanks to xet7 !
2026-09-14 12:44:26 +03:00
Lauri Ojansivu 5b1ec70e94 Validate Esperanto checklist completion and metadata labels
Use the correct native ReVo komplet entry and retain six checklist state translations plus thirty correct authentication, custom metadata and date labels.

Thanks to xet7 !
2026-09-14 12:44:03 +03:00
Lauri Ojansivu 74114f5856 Update translation audit after Esperanto custom-field review
Record dated repair commit, corrected example coverage and current counts. Preserve open language and browser validation requirements.

Thanks to xet7 !
2026-09-14 12:43:10 +03:00
Lauri Ojansivu 3b44bfb5e9 Clarify Esperanto custom-field value removal
Replace misconfiguration wording with value removal, retain fifty-two valid rule and hierarchy labels, and preserve translated comma-separated example names in review coverage.

Thanks to xet7 !
2026-09-14 12:42:37 +03:00
Lauri Ojansivu adc40ef818 Record Esperanto member and subtask translation repairs
Update dated audit counts, evidence and upcoming changelog with the verified local repair commit. Keep remaining language and browser review open.

Thanks to xet7 !
2026-09-14 12:41:29 +03:00
Lauri Ojansivu fbc39261f7 Repair Esperanto member notification and subtask activity wording
Use a singular member reference and a finite past verb with the established swimlane term. Retain fourteen correct rule and filter translations after semantic review.

Thanks to xet7 !
2026-09-14 12:40:33 +03:00
Lauri Ojansivu 8d3e71f0b3 Record Esperanto webhook and date validation progress
Update dated local review and exact counts in short audit, evidence and upcoming changelog, preserving remaining validation requirements.

Thanks to xet7 !
2026-09-14 12:37:27 +03:00
Lauri Ojansivu e4e614f298 Validate restored Esperanto webhook and date labels
Retain 40 directly reviewed correct values. Preserve webhook direction, field sum meaning, private-only policy, date endpoint distinctions and irreversible notification deletion warning. Existing uncertain terms remain open.

Thanks to xet7 !
2026-09-14 12:37:11 +03:00
Lauri Ojansivu 5a30f3f957 Record Esperanto Unwatch repair and mail review progress
Update dated local hash and exact reconstructed counts in short audit and upcoming changelog; remaining language/browser validation stays open.

Thanks to xet7 !
2026-09-14 12:36:43 +03:00
Lauri Ojansivu 5ef0759877 Repair Esperanto unwatch wording and validate upload and mail labels
Express stopping observation/subscription rather than looking. Retain 37 correct restored shortcut, upload, invitation and SMTP values; keep overtime terminology unresolved. Verify placeholders and both translation ledgers.

Thanks to xet7 !
2026-09-14 12:36:24 +03:00
Lauri Ojansivu 5e2ba642b9 Record Esperanto mapping and selection validation progress
Update dated local review and exact reconstructed counts in short audit, evidence and upcoming changelog. Keep unresolved terminology and browser validation open.

Thanks to xet7 !
2026-09-14 12:35:41 +03:00
Lauri Ojansivu ba7f76e53e Validate restored Esperanto member mapping and selection labels
Retain 40 directly reviewed correct values. Preserve administrator minimum, assigned-only scope, invitation state, image constraints, login links and placeholders. Correct emoji autocomplete wording is distinct from unresolved checklist completion terms.

Thanks to xet7 !
2026-09-14 12:35:23 +03:00
Lauri Ojansivu 65aa56ae29 Record Esperanto sorting and filter validation progress
Record dated local review, exact counts and remaining long-form syntax/language verification in short audit and upcoming changelog.

Thanks to xet7 !
2026-09-14 12:34:55 +03:00
Lauri Ojansivu 5ab78031d9 Validate restored Esperanto sorting and filter labels
Retain 34 directly reviewed correct values, preserving date ranges, absent-field states, manual order, import format meanings and export restrictions. Keep long advanced-filter syntax and earlier uncertain terminology open.

Thanks to xet7 !
2026-09-14 12:34:38 +03:00
Lauri Ojansivu 28a865dcbf Record Esperanto date-format repair and export review progress
Update dated local repair hash, exact reconstructed counts and remaining validation scope in short audit, evidence and upcoming changelog.

Thanks to xet7 !
2026-09-14 12:34:10 +03:00
Lauri Ojansivu 1b2232534d Restore Esperanto date-format notation and validate export guidance
Replace foreign JJJJ/TT abbreviations with canonical YYYY/DD notation in three format labels. Retain 37 correct restored field, email and export values. Verify correction records, placeholders, key order and unchanged acceptances.

Thanks to xet7 !
2026-09-14 12:33:50 +03:00
Lauri Ojansivu 5e779f5303 Record Esperanto role and field validation progress
Keep dated short audit and changelog current with actual local review, reconstructed counts and remaining language/browser validation.

Thanks to xet7 !
2026-09-14 12:33:08 +03:00
Lauri Ojansivu 5ba04c1021 Validate restored Esperanto roles and custom-field labels
Retain 49 directly reviewed correct values. Preserve assigned-card scope, comment/read restrictions, field types and none/unknown states. Keep the lime color term and earlier uncertain findings open.

Thanks to xet7 !
2026-09-14 12:32:50 +03:00
Lauri Ojansivu 232c97fac1 Record Esperanto calendar and voting validation progress
Keep dated local review, exact reconstructed counts and open validation scope current in the short audit and upcoming changelog.

Thanks to xet7 !
2026-09-14 12:32:24 +03:00
Lauri Ojansivu 8be47d3b3d Validate restored Esperanto calendar and voting controls
Retain 50 directly reviewed correct zoom, board-view, archive, voting and avatar labels. Preserve numeric bounds, date directions, visibility meaning, literal product names and question-mark notation.

Thanks to xet7 !
2026-09-14 12:32:07 +03:00
Lauri Ojansivu 6f85909d0d Record Esperanto watch title repair and subtask validation
Update dated short audit, actual local source hash and exact progress. Correct the complex-versus-complete dictionary attribution and keep completion terminology unresolved.

Thanks to xet7 !
2026-09-14 12:31:40 +03:00
Lauri Ojansivu 9ee9d2357d Repair Esperanto watch settings title and validate subtask wording
Use observation terminology for watch settings. Retain 33 correct restored values, including transparent subtask compounds after checking ReVo task vocabulary, and attachment/template/mode controls. Completion wording remains under review.

Thanks to xet7 !
2026-09-14 12:31:18 +03:00
Lauri Ojansivu 34701c8c8a Record Esperanto workspace review and recovered dictionary evidence
Update dated local review progress and exact counts. Record directly fetched ReVo task source without claiming full completion terminology validation.

Thanks to xet7 !
2026-09-14 12:30:27 +03:00
Lauri Ojansivu 6f096bfeb6 Validate restored Esperanto workspace and activity wording
Retain 47 directly reviewed correct values, preserving date distinctions, source/destination order, workspace hierarchy, administrator powers and loading data-loss warnings. Completion terminology remains open.

Thanks to xet7 !
2026-09-14 12:30:01 +03:00
Lauri Ojansivu 195eda9d97 Record Esperanto lockout and storage validation progress
Update dated short audit, evidence and upcoming changelog with actual local review and reconstructed counts. Remaining language and browser validation stays open.

Thanks to xet7 !
2026-09-14 12:29:20 +03:00
Lauri Ojansivu e88feb32ae Validate restored Esperanto lockout and storage translations
Retain 48 directly reviewed correct values. Preserve upload units, ZIP layout instructions, lockout identities, activation polarity, job failure/success distinctions, S3 endpoint examples and placeholders. Uncertain terminology remains open.

Thanks to xet7 !
2026-09-14 12:29:03 +03:00
Lauri Ojansivu 35fd800f54 Record Esperanto template repair and advanced-search review progress
Keep dated short audit and changelog current with actual local commit and verified counts. Record failed completion reference retrieval as unresolved, preserving the broader review scope.

Thanks to xet7 !
2026-09-14 12:28:34 +03:00
Lauri Ojansivu b92bbca3e9 Repair Esperanto template Enter instruction and validate search guidance
Name the Enter key explicitly in string-template item guidance. Retain 52 correct restored search, report, organization and storage values, preserving logical operators, commands and placeholders. Completion and subtask terminology remain under review.

Thanks to xet7 !
2026-09-14 12:28:14 +03:00
Lauri Ojansivu 8b136b4d33 Record Esperanto rule and search validation progress
Keep short audit current with dated local review, reconstructed counts and remaining validation scope.

Thanks to xet7 !
2026-09-14 12:27:21 +03:00
Lauri Ojansivu e2ef875c85 Validate restored Esperanto rule and search instructions
Retain 53 directly reviewed correct rule, card-view and search values. Preserve action polarity, wildcard and comma-separation instructions, operator syntax, HTML tags and placeholders. Uncertain terminology remains in the restored queue.

Thanks to xet7 !
2026-09-14 12:27:04 +03:00
Lauri Ojansivu 1835b5b184 Summarize current translation review and retain detailed evidence
Record the dated Esperanto settings review and exact progress. Shorten Audit.md while preserving accumulated notes in Audit-Evidence.md and keeping all pending, provenance and browser validation requirements open. Verify audit and changelog checks.

Thanks to xet7 !
2026-09-14 12:26:37 +03:00
Lauri Ojansivu b999becb4c Validate restored Esperanto settings and rule actions
Retain 58 directly reviewed correct values. Preserve memory distinctions, custom-field scope, parent relationships, activity placeholders and rule movement directions. Completion, subtask, member-pronoun and overtime terminology remain open.

Thanks to xet7 !
2026-09-14 12:25:30 +03:00
Lauri Ojansivu d35969905d Record Esperanto notification and search translation progress
Update dated audit and upcoming changelog with local source commit, verified counts and remaining validation limits.

Thanks to xet7 !
2026-09-14 12:25:03 +03:00
Lauri Ojansivu ab4da5ab27 Repair Esperanto watch notifications and search-key wording
Preserve observation/subscription semantics and explicitly identify Enter. Retain 61 correct restored role, shortcut, warning and configuration values. Verify placeholders, correction ledger and unchanged values; uncertain member pronoun and overtime labels stay open.

Thanks to xet7 !
2026-09-14 12:24:44 +03:00
Lauri Ojansivu 8c22f98b17 Record Esperanto Enter-key repair and transfer review progress
Record dated local repair commit, exact reconstructed progress and unverified remaining language/browser work.

Thanks to xet7 !
2026-09-14 12:24:04 +03:00
Lauri Ojansivu 620007ebc0 Repair Esperanto Enter-key instruction and validate transfer wording
Name the Enter key explicitly instead of using the direction inwards. Retain 64 correct restored import, export, invitation and deletion values; preserve vendor menu labels, JSON property names and placeholders. Verify correction and unchanged-value ledgers.

Thanks to xet7 !
2026-09-14 12:23:43 +03:00
Lauri Ojansivu 8fa772ae15 Record Esperanto watch repair and board-control validation
Update dated local audit, evidence and upcoming changelog with repair commit and reconstructed progress. Wider translation validation remains open.

Thanks to xet7 !
2026-09-14 12:23:07 +03:00
Lauri Ojansivu 1c4a07cde5 Repair Esperanto automatic-watch wording and validate board controls
Use ongoing observation rather than merely looking at boards. Retain 59 correct restored board/card controls and warnings after direct review. Verify correction ledger, placeholders and unchanged values.

Thanks to xet7 !
2026-09-14 12:22:49 +03:00
Lauri Ojansivu 55dce7200e Document LDAP bind diagnostic repair and remaining investigation
Record local repair and tested limits without claiming the directory authentication failure is resolved.

Thanks to Nissulya and xet7 !
2026-09-14 12:22:06 +03:00
Lauri Ojansivu 5f5822f7d0 Preserve actionable redacted LDAP bind errors
LDAP errors were serialized as empty objects because their name and message are non-enumerable. Preserve diagnostic name, message, code and reason through the existing secret sanitizer. Verify certificate and credential diagnostics plus disabled logging.

Thanks to Nissulya and xet7 !

Refs #6692
2026-09-14 12:21:37 +03:00
Lauri Ojansivu 2f0dbbf370 Record restored Esperanto translation review progress
Record dated local commit and verified counts while issue 6692 is prioritized. Broader translation repairs remain open.

Thanks to xet7 !
2026-09-14 12:19:14 +03:00
Lauri Ojansivu 2092f78608 Validate restored Esperanto activities and card controls
Retain 60 directly reviewed correct values, preserving past-tense activity grammar, accusative objects, movement directions, keyboard toggle polarity and literal placeholders. Completion and subtask terminology remain awaiting closer review.

Thanks to xet7 !
2026-09-14 12:18:55 +03:00
Lauri Ojansivu f82b12f1f8 Record restored Danish storage and monitoring review progress
Update dated local audit evidence and upcoming changelog with reconstructed counts, review commits and four remaining context-dependent Danish labels.

Thanks to xet7 !
2026-09-14 12:18:18 +03:00
Lauri Ojansivu ed9be5431c Validate restored Danish monitoring and account wording
Review remaining restored Danish resource, interval, repository and account labels directly. Preserve correct wording, thresholds, units and identifier constraints; leave four context-dependent labels open.

Thanks to xet7 !
2026-09-14 12:17:54 +03:00
Lauri Ojansivu 9442439179 Validate restored Danish storage and migration translations
Retain 68 correct values after direct review. Preserve technical endpoint examples, region identifiers and migration outcome distinctions. Obsolete migration labels remain in translation scope without claiming the corresponding feature is active.

Thanks to xet7 !
2026-09-14 12:17:35 +03:00
Lauri Ojansivu 761dcbc386 Record Danish control translation validation progress
Update dated audit and upcoming changelog with local review commit, reconstructed counts and remaining uncertainty.

Thanks to xet7 !
2026-09-14 12:17:10 +03:00
Lauri Ojansivu 3eeef49053 Validate restored Danish controls and administrator labels
Retain 63 correct translations after direct review, including shared Danish and English Start, Stop and Support vocabulary. Preserve byte units, ISO week numbering and scheduled-job outcome distinctions. Keep ambiguous free and Complete labels awaiting context validation.

Thanks to xet7 !
2026-09-14 12:16:51 +03:00
Lauri Ojansivu d8212bc9df Record dated Danish translation review progress
Update the short audit, evidence and upcoming changelog with actual local repair commit and reconstructed counts. Translation repairs and broader validation remain open.

Thanks to xet7 !
2026-09-14 12:16:20 +03:00
Lauri Ojansivu cceae079c1 Repair Danish legal notice and malloc diagnostic wording
Review restored Danish values directly, retaining 41 correct translations. Correct singular adjective agreement and preserve the malloc allocation method in the heap diagnostic. Verify correction records and unchanged acceptances.

Thanks to xet7 !
2026-09-14 12:15:35 +03:00
Lauri Ojansivu 8ca8a30ab2 Document consistent organization mirror log paths
Thanks to xet7 !
2026-09-14 12:14:16 +03:00
Lauri Ojansivu a744eb907f Standardize organization mirror log datetime directories
Use the shared log-directory reservation for organization reports and update remaining path examples. Verify report paths with offline organization fixtures.

Thanks to xet7 !
2026-09-14 12:14:08 +03:00
Lauri Ojansivu e0d529d919 Document SubtaskDepositBleed repairs and remaining validation 2026-09-14 12:09:55 +03:00
Lauri Ojansivu c50d7b4ea7 Authorize subtask deposit reads and destination writes
Remove unvalidated deposit and null board IDs from source-card scope. Publish deposit content beneath its own reactive visibility-filtered board cursor, applying destination assignment restrictions and reactive card children. Filter status counts by visible assigned scopes.

Require destination write access before pointer changes and subtask landing structures, and deny client pointer rename bypasses. Summarize blocked writes in Problems. Positive decisions, scope/dispatcher inventory and existing subtask/status suites pass; browser regression syntax-check passes with live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 12:09:35 +03:00
Lauri Ojansivu cb8fb48514 Document LinkedWriteBleed remediation and verification 2026-09-14 12:05:31 +03:00
Lauri Ojansivu 26e9e70304 Prevent linked cards from promoting non-writing source roles
Require source write access for authoritative and DDP link creation, including pointer changes. Treat explicit non-writing source roles as a ceiling on delegated writes, covering legacy self-created links. Match UI permissions and remove the link action from the non-writer menu. Record denied writes in bounded Problems summaries.

Actual shared permission decisions for every role, creation/deny inventory and existing link and role suites pass. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 12:05:14 +03:00
Lauri Ojansivu 2d2671ead9 Document InvitationBoardBleed remediation and verification limits 2026-09-14 12:03:13 +03:00
Lauri Ojansivu af93621261 Authorize every board grant before sending registration invitations
Domain-approved inviters must hold an allowed inviter role on each requested board. Site admins retain access to real boards; missing boards fail closed. Validate the complete grant before creating or changing any invitation code or sending mail, and summarize rejected grants in Problems.

Role and grant inventory plus invitation email suites pass. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 12:02:59 +03:00
Lauri Ojansivu 41c05a8001 Record standardized build and release log directory format 2026-09-14 12:02:59 +03:00
Lauri Ojansivu 0d6be31986 Standardize build and release log directories on readable datetimes
Use operation/YYYY-MM-DD_HH-MM-SS for Unix and Windows build logs, mirror launcher and data reports, translation push reports, conformance and speed diagnostics. Preserve earlier same-second runs with reserved suffixes. Keep record timestamps in their existing data format.

Path and collision fixtures, build progress and parity, mirror launcher and Transifex suites pass. Shell syntax checks pass; Windows execution was not available. Update the internal release preflight inventory used by parity checks.

Thanks to xet7 !
2026-09-14 12:02:36 +03:00
Lauri Ojansivu 388f3be073 Record Transifex status retry repair in upcoming changelog 2026-09-14 11:57:56 +03:00
Lauri Ojansivu 7f24f80355 Retry transient Transifex upload status failures with progress
The saved 2026-09-14 run abandoned its accepted English upload after a status GET returned 502, preventing all 241 target uploads. Add bounded safe-read retries, throttling delays respecting Retry-After, and visible upload/job/retry progress. Do not resubmit uncertain failed writes.

Offline tests reproduce source-job recovery without duplicate submissions, throttle timing, permanent error behavior, retry bounds and Retry-After parsing. Existing upload, locale retry and pull suites pass; no remote uploads were run.

Thanks to xet7 !
2026-09-14 11:57:44 +03:00
Lauri Ojansivu 541a6d1fb3 Document invitation-profile repair and test-only scanning alert 2026-09-14 11:55:42 +03:00
Lauri Ojansivu 11d2fe037c Use the actual HTML sanitizer in activity viewer tests
Resolve code-scanning alert 540 by removing a regex sanitizer stub. Test malformed script end tags with the existing sanitize-html parser. The reported location is test-only, not an application sanitizer.

Thanks to GitHub CodeQL and xet7 !
2026-09-14 11:55:21 +03:00
Lauri Ojansivu 055cf42d49 Protect server-issued invitations from client profile updates
Reject invitation field writes, array mutations, parent replacement and rename destinations. Inspect actual modifier paths so top-level profile field reporting does not block ordinary preference updates. Record denied invitation changes through bounded Problems summaries.

Profile guard and existing invitation suites pass. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:55:21 +03:00
Lauri Ojansivu 77d4e97b10 Document RuleButtonBleed remediation and verification 2026-09-14 11:53:20 +03:00
Lauri Ojansivu 64123a603a Bind manual rule execution to a writable board and its card
Check write capability and authoritative card board before button dispatch and again in the shared action dispatcher. Board buttons without a card remain supported. Record denied contexts in bounded Problems summaries.

Role and boundary decisions plus dispatcher inventory and existing rule suites pass. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:53:05 +03:00
Lauri Ojansivu 0ef30cabec Document ManageBoardBleed remediation and verification 2026-09-14 11:51:59 +03:00
Lauri Ojansivu c33e9c3bf9 Require administrator privileges for REST board management
Align board title, card settings and all rule mutations with existing DDP administrator policy. Preserve site-admin access and record refused management attempts in bounded Problems summaries.

Actual guard and endpoint inventory tests pass along with card-settings and rule suites. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:51:24 +03:00
Lauri Ojansivu f42ae665a7 Document CommentBoundaryBleed remediation and verification limits 2026-09-14 11:50:06 +03:00
Lauri Ojansivu d7ac619d63 Bind comment inserts to the authorized card board
Reject foreign-card REST and DDP comment inserts and prevent DDP rebinding from bypassing the boundary. Keep card-authoritative legacy comment listing. Add bounded Problems summaries and attack, negative insert inventory and browser regression coverage.

Targeted Node suites pass; browser regression is syntax-checked with live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:49:40 +03:00
Lauri Ojansivu 7c2d39fe4d Document MutationBleed remediation and remaining security review 2026-09-14 11:48:03 +03:00
Lauri Ojansivu 9b1fb5214f Require board write capability for list moves and sibling mutations
Enforce the canonical role policy for both sides of list, swimlane and checklist moves, scoped imports, attachment renames and history writes. Record denied attempts through bounded Problems summaries without allowing logging failures to bypass authorization.

Add role-matrix decisions, the reported moveList attack, sibling guard inventory and a browser regression. Targeted Node suites pass; live browser execution remains pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:47:29 +03:00
Lauri Ojansivu fc34861b04 Document VisibilityBleed remediation and remaining security reports
Add critical upcoming release entry and dated remediation progress. Record passing policy, negative insert inventory and catalog coverage; live browser execution and nine other reports remain pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:43:33 +03:00
Lauri Ojansivu 962debc12d Enforce private-only board visibility across server creation methods
Apply instance visibility policy to direct board creation and card-to-board conversion. Record blocked public overrides with bounded Problems summaries, preserving enforcement if logging fails. Positive policy and negative insert-inventory suites pass; browser regression is syntax-checked but live execution remains pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:43:10 +03:00
Lauri Ojansivu c715235451 Record Danish spinner repair and security-priority checkpoint
Update dated progress with 349 reviewed Danish values and 3,709 restored values still awaiting validation. Keep translation repairs open while prioritizing the requested wekansec21 security findings.

Thanks to xet7 !
2026-09-14 11:40:25 +03:00
Lauri Ojansivu 04df440db8 Restore Danish outward-spinner qualifier and validate controls
Review thirty restored values on 2026-09-14. Restore outward scaling confirmed by spinner CSS and retain twenty-nine correct labels unchanged, preserving sort directions, creator roles, placeholder syntax and ticket states.

Thanks to xet7 !
2026-09-14 11:37:57 +03:00
Lauri Ojansivu a1c51b6997 Record Danish Boolean search translation review progress
Update dated audit and changelog with 319 reviewed Danish values, 496 retained findings and 3,739 restored values awaiting validation. Preserve full remaining repair scope.

Thanks to xet7 !
2026-09-14 11:37:03 +03:00
Lauri Ojansivu c6d3b9e0e4 Validate Danish restored Boolean search instructions
Review thirty complete values on 2026-09-14. Preserve OR versus AND operators, executable examples, title/comment/label matching, pagination and date predicates. Retain correct Danish unchanged; ambiguous export wording remains open.

Thanks to xet7 !
2026-09-14 11:36:43 +03:00
Lauri Ojansivu b649cb7e2a Record Danish search label validation progress
Update dated audit and changelog with 289 reviewed Danish values, 466 retained findings and 3,769 restored values awaiting validation. Preserve pending repairs and ambiguous wording review.

Thanks to xet7 !
2026-09-14 11:36:08 +03:00
Lauri Ojansivu 6531c37d2c Validate Danish restored search labels and result counts
Review thirty complete values on 2026-09-14. Preserve zero/one/multiple result counts, not-found subjects, creator/assignee and created/modified distinctions, time periods and predicates. Ambiguous export wording remains unreviewed.

Thanks to xet7 !
2026-09-14 11:35:46 +03:00
Lauri Ojansivu 10b29f907d Record Danish display validation and ambiguous export wording
Update dated summaries with 259 reviewed Danish values, 436 retained original findings and 3,799 restored values awaiting validation. Keep ambiguous free export label and all remaining review open.

Thanks to xet7 !
2026-09-14 11:35:16 +03:00
Lauri Ojansivu b8b7f8235e Validate Danish restored display and task controls
Review twenty-nine complete values on 2026-09-14. Preserve selected above/below directions, ALL unread actions, technical JSON identifiers and valid shared Danish words. Leave ambiguous export free wording awaiting source-context review.

Thanks to xet7 !
2026-09-14 11:34:56 +03:00
Lauri Ojansivu 7f223493fb Record Danish migration status and account wording review
Update dated audit and current summaries with 230 reviewed Danish values, 407 retained original findings and 3,828 restored values awaiting validation. Keep pending and uncertain review scope intact.

Thanks to xet7 !
2026-09-14 11:34:21 +03:00
Lauri Ojansivu 2250b6716f Validate Danish restored migration status and account warnings
Review thirty full values on 2026-09-14. Preserve background continuation and slower-completion warning, batch range, attachment counters, temporary lockout cause and later retry. Retain valid Danish orange unchanged.

Thanks to xet7 !
2026-09-14 11:33:59 +03:00
Lauri Ojansivu fc58887e3c Record Danish migration translation validation progress
Update dated audit and changelog totals to 200 reviewed Danish values, 377 retained original findings and 3,858 restored values awaiting validation. Preserve all pending repair scope.

Thanks to xet7 !
2026-09-14 11:33:30 +03:00
Lauri Ojansivu 12d02f4dc5 Validate restored Danish migration and S3 instructions
Review thirty full Danish source meanings on 2026-09-14. Preserve duplicate-list AND conditions, conversion order, non-archived recovery, all-archived restoration, difficult-undo warnings and storage scopes. Retain valid wording unchanged without claiming obsolete migrations are active.

Thanks to xet7 !
2026-09-14 11:33:09 +03:00
Lauri Ojansivu a2e12764d2 Record Danish scheduling and storage wording review progress
Synchronize dated audit and changelog with 170 reviewed Danish values, 347 retained original findings and 3,888 restored values awaiting validation. All pending and uncertain language work remains open.

Thanks to xet7 !
2026-09-14 11:32:37 +03:00
Lauri Ojansivu 5fcf0d284c Validate Danish restored scheduling and storage controls
Review thirty complete values on 2026-09-14. Retain correct current-state/inverse-action tooltips, scheduled-job errors, pause/resume distinctions, all-migration stop and storage/authentication descriptions. Remaining review is open.

Thanks to xet7 !
2026-09-14 11:32:17 +03:00
Lauri Ojansivu 0b4d99a3be Record Danish attachment and lockout translation validation
Update dated audit and changelog summaries with 140 reviewed Danish values, 317 retained original findings and 3,918 restored values awaiting validation. Keep pending and uncertain wording review open.

Thanks to xet7 !
2026-09-14 11:31:47 +03:00
Lauri Ojansivu 807ceeee25 Validate Danish restored attachment and lockout controls
Review thirty complete Danish values on 2026-09-14. Retain correct board attachment scopes, upload cancellation, support restrictions, lockout distinctions and unlock actions unchanged. Remaining translations still require review.

Thanks to xet7 !
2026-09-14 11:31:27 +03:00
Lauri Ojansivu f39aade54e Record Danish diagnostic repairs and restored-value review progress
Update dated summaries with two repaired diagnostics and twenty-eight retained values. Record 15,538 corrected findings, 287 retained and 3,948 restored values awaiting validation. Remaining review is open.

Thanks to xet7 !
2026-09-14 11:31:00 +03:00
Lauri Ojansivu e5d7da30e0 Repair Danish heap diagnostic meanings and validate restored controls
Review thirty restored Danish values on 2026-09-14. Correct peak malloc allocation and heap garbage bit-pattern overwriting using Node documentation. Retain twenty-eight correct values unchanged, including deletion constraints and attachment destinations.

Thanks to xet7 !
2026-09-14 11:30:33 +03:00
Lauri Ojansivu 67788fe644 Record Danish search wording validation progress
Update the dated audit and current summaries to eighty reviewed Danish values, 259 retained findings and 3,978 restored values awaiting review. Preserve pending repair scope and distinguish wording review from parser correctness.

Thanks to xet7 !
2026-09-14 11:29:46 +03:00
Lauri Ojansivu eb1f433e25 Validate Danish restored search instructions and errors
Review thirty complete values on 2026-09-14. Preserve correct Danish source correspondence, operator examples, inclusive ages, missing-value and descending-sort syntax, permission-related scopes and exact troubleshooting commands. Independent source/parser behavior remains outside this wording review.

Thanks to xet7 !
2026-09-14 11:29:24 +03:00
Lauri Ojansivu f6114528ce Update audit after second Danish restored-value review
Record dated validation of fifty Danish values in total. Synchronize summaries to 229 retained findings and 4,008 restored values awaiting validation. Remaining repairs remain open.

Thanks to xet7 !
2026-09-14 11:28:57 +03:00
Lauri Ojansivu 9abcbc4245 Validate thirty more restored Danish translations
Review complete Danish instructions and errors on 2026-09-14. Preserve correct no-undo warnings, due-card permission scope, activity locations, search errors and placeholders unchanged. Remaining restored values still need review.

Thanks to xet7 !
2026-09-14 11:28:36 +03:00
Lauri Ojansivu b28f2811d4 Record Danish restored-value validation progress
Update dated summaries after twenty correct Danish translations were retained. Record 199 reviewed original findings and 4,038 restored values awaiting validation; all remaining repairs and uncertain wording remain open.

Thanks to xet7 !
2026-09-14 11:28:09 +03:00
Lauri Ojansivu 1598868213 Validate and retain twenty restored Danish translations
Review complete Danish meanings on 2026-09-14. Preserve correct wording, identifiers, count spacing and left/right directions. Record reviewed values without changing translations or claiming the remaining restored queue complete.

Thanks to xet7 !
2026-09-14 11:27:52 +03:00
Lauri Ojansivu ba6fa5c4d3 Verify placeholder integrity across restored translation findings
Review all 4,058 restored values on 2026-09-14 and add token-inventory regression coverage. No mismatches found. Keep every restored value awaiting language validation; structural validity does not establish fluency.

Thanks to xet7 !
2026-09-14 11:27:03 +03:00
Lauri Ojansivu c63a7fcdff Record Tamazight spent-time and sorting repair progress
Update the dated audit and current changelog summaries with 18,131 correction records. All 308 pending original findings and wider fluent review remain open.

Thanks to xet7 !
2026-09-14 11:25:48 +03:00
Lauri Ojansivu edfed81761 Repair Tamazight spent-time and sorting controls
Replace three additional Arabic/French labels on 2026-09-14, preserving noun-only versus Change actions. Reuse existing spent-time wording and native sorting terminology. Full participle and agreement remain low confidence pending fluent review.

Thanks to xet7 !
2026-09-14 11:25:26 +03:00
Lauri Ojansivu 3e3eb91efb Update translation repair progress after due-date title correction
Record the dated source commit and 18,128 verified correction records. Keep all 308 pending original findings, restored values and uncertain date terminology under review.

Thanks to xet7 !
2026-09-14 11:24:42 +03:00
Lauri Ojansivu db8421e9b4 Repair Tamazight due-date popup title
Replace the additional Arabic Change Due Date title on 2026-09-14. Reuse existing Due Date terminology and the native Change imperative used by neighboring date popups. Wider fluent terminology review remains open.

Thanks to xet7 !
2026-09-14 11:24:19 +03:00
Lauri Ojansivu 74fd190c3d Synchronize current translation repair summaries with verified progress
Correct stale TODO Later and upcoming aggregate totals on 2026-09-14. Record 15,536 corrected original findings, 308 pending, and 18,127 correction records. Preserve historical batch snapshots and all unresolved fluency work.

Thanks to xet7 !
2026-09-14 11:23:29 +03:00
Lauri Ojansivu fb01497bc1 Document Tamazight parent-label repairs and remaining review
Update dated audit progress to 18,127 correction records and 308 pending original findings. Record native terminology sources and the verified display-only semantics; full grammar remains open.

Thanks to xet7 !
2026-09-14 11:22:18 +03:00
Lauri Ojansivu 9b11c99d98 Repair Tamazight parent card and hidden-parent labels
Replace French labels on 2026-09-14. Preserve the display-only meaning of no-parent, using native Hide rather than deleting the relationship. Parent compound and bound-state adaptation remain low confidence pending fluent review.

Thanks to xet7 !
2026-09-14 11:21:57 +03:00
Lauri Ojansivu cfcb759877 Verify and document Tamazight visibility notice repairs
Update the dated audit with 18,125 correction records and 309 pending original findings. Verify source HTML emphasis, removal of Arabic and future-state wording. Keep grammar review explicitly open.

Thanks to xet7 !
2026-09-14 11:21:16 +03:00
Lauri Ojansivu 084d44fab6 Repair Tamazight public and private board notices
Replace Arabic visibility messages on 2026-09-14, preserving future state and HTML emphasis. Feminine agreement and full future construction remain low confidence pending fluent review. All correction records pass structural verification.

Thanks to xet7 !
2026-09-14 11:20:32 +03:00
Lauri Ojansivu 1006a322a6 Update translation audit after Tamazight authorization repair
Record the 2026-09-14 repair commit, 18,123 verified corrections and 310 pending original findings. Keep restored values and low-confidence grammar explicitly open.

Thanks to xet7 !
2026-09-14 11:19:54 +03:00
Lauri Ojansivu 739495cf8b Repair Tamazight page-view authorization error
Replace the Arabic error with native-source-derived permission denial on 2026-09-14. Preserve the restriction to viewing this page. Combined grammar remains low confidence pending fluent review. Verify all 18,123 correction records and placeholder inventories.

Thanks to xet7 !
2026-09-14 11:19:30 +03:00
Lauri Ojansivu bbeb79124d Record additional mixed-language Veps controls for repair
Review local accessibility and parent-card values on 2026-09-14. Record ten additional keys, including a Venda inheritance instruction in the Veps locale, without claiming a fluent replacement or reducing pending counts.

Thanks to xet7 !
2026-09-14 11:18:16 +03:00
Lauri Ojansivu c67a747514 Record complete Veps escape-marker syntax verification in translation audit
Update the audit and upcoming changelog with the standalone escape-marker follow-up. Full Veps prose review remains pending; translation completion counts are unchanged.

Thanks to xet7 !
2026-09-14 11:17:21 +03:00
Lauri Ojansivu cd563cce58 Repair Veps filter standalone escape marker and broaden syntax coverage
On 2026-09-14 compare all escape runs against English, preserving the open full language review. Record dictionary access and authority limits.

Thanks to xet7 !
2026-09-14 11:14:12 +03:00
Lauri Ojansivu f0351b3901 Document changelog link repair in upcoming release notes
Record 14d6a8cd1 and passing shell and changelog checks.

Thanks to xet7 !
2026-09-14 11:12:59 +03:00
Lauri Ojansivu 14d6a8cd14 Repair stale translation changelog links and truthful preflight reporting
Repoint four missing hashes to local commits with matching subjects. Report unresolved links without a contradictory success message, propagate checker failures and treat an unchanged changelog as a successful check.

Thanks to xet7 !
2026-09-14 11:12:47 +03:00
Lauri Ojansivu 368e8ab1b4 Document mirror HTTP attachment crash repair in upcoming changelog
Record 6dd41dd41 and targeted positive and negative regression coverage.

Thanks to xet7 !
2026-09-14 11:11:58 +03:00
Lauri Ojansivu 6dd41dd414 Handle unsupported attachment HTTP statuses without crashing mirror archives
Reject invalid statuses and malformed headers inside the HTTP response callback, close rejected streams and drain bodyless responses. Regression tests cover unsupported statuses, malformed headers and successful downloads.

Thanks to xet7 !
2026-09-14 11:11:45 +03:00
Lauri Ojansivu ad3b67dfa9 Record partial Veps filter syntax repair in audit and upcoming changelog
On 2026-09-14 document d0c247094, passing example checks and the still-open full language review without changing completed-language counts.

Thanks to xet7 !
2026-09-14 11:10:50 +03:00
Lauri Ojansivu d0c2470946 Repair executable examples in Veps filter help without closing language review
On 2026-09-14 restore exact source comparison, escaping and Boolean examples. Positive and negative regression checks preserve the open Veps language queue; Finnish prose remains awaiting repair.

Thanks to xet7 !
2026-09-14 11:10:12 +03:00
Lauri Ojansivu afc5d988be Correct Veps example review against exact decoded JSON
Record single equality sign and doubled escape rather than an absent escape. Directly asserted current JSON on 2026-09-14.

Thanks to xet7 !
2026-09-14 11:09:31 +03:00
Lauri Ojansivu 61cab2cc1f CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 11:09:21 +03:00
Lauri Ojansivu b3fb0e0b7c Identify Veps filter example escape loss and native field terminology
On 2026-09-14 directly inspect locale JSON and native field keys; keep full language review open rather than treating syntax repair as translation completion.

Thanks to xet7 !
2026-09-14 11:09:11 +03:00
Lauri Ojansivu 742f71766b Document Veps translation review requirements and verified control terms
On 2026-09-14 isolate review of Finnish-seeded labels, distinguish native source evidence from full phrase validation and preserve all filter syntax requirements.

Thanks to xet7 !
2026-09-14 11:08:41 +03:00
Lauri Ojansivu b3d4fdbd5d Record native Veps control terminology for remaining translation review
On 2026-09-14 confirm legacy locale identity and native software components while preserving full shortcut and operator-help review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu 2d0160eeff Verify rendered allocation and context spellings for translation audit
On 2026-09-14 resolve emphatic-letter extraction substitutions while retaining complete diagnostic modifier review and source authority limits.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu 35dded7943 Record inspected heap terminology and diagnostic translation distinctions
On 2026-09-14 verify rendered Heap candidate while preserving all pending diagnostic qualifiers and source authority limits.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu f8d71633a6 Record provisional CLDR calendar evidence in translation audit
On 2026-09-14 verify exact native calendar labels and distinguish provisional Islamic wording from missing native variant display names. Values and progress counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu 7328bf00e8 Update dated translation audit for selection scope repairs
Record 6352fbd5e and upcoming changelog progress, preserving unresolved native-language review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu 902ff1859b Repair Tamazight board and list selection scopes
On 2026-09-14 preserve only one board versus all cards in this list, including missing All in the Arabic label. Full commands remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu f12f25ef8c Record additional selection translation repairs in dated audit
Update upcoming changelog for 3f72fb6e8, preserving unchanged original queue counts and unresolved native review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu dc8d40ad05 Align Tamazight select all controls with native selection terminology
On 2026-09-14 preserve selecting all versus removing selection from all. Derived command and action noun remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu a2c75b3a87 Clarify obsolete migration strings in translation audit scope
On 2026-09-14 inspect removed migration imports and surviving locale inventory. Preserve repair scope without implying an active feature; distinguish Integrity from Integration evidence.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 8dfda6f0eb Update dated translation audit for storage engine repair
Record afca796a0 and upcoming changelog progress while retaining unresolved native language review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu f3fda75a54 Translate Tamazight MongoDB storage engine label
On 2026-09-14 use visually inspected engine and storage candidates, preserving MongoDB. Cross-variety compound and bound form remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu b2d5d527ce Update translation audit and upcoming changelog for zoom repairs
Record 35eb7e7ab and verified dated counts, retaining unresolved native language review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 72a70be095 Translate Tamazight zoom controls with reviewed dictionary terms
On 2026-09-14 preserve zoom direction, level and exact 50-300% input range. Cross-variety terminology and full phrases remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 0f0fe17c8f Record visually inspected Tamazight zoom control candidates
On 2026-09-14 verify Level and Zoom In/Out letters from rendered dictionary pages, retaining cross-variety adaptation and full input command review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu a249a10b35 Record native notification terminology repairs in translation audit
Update dated progress and upcoming changelog for ca3ba7006; full warning review remains open.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 9bb6154eeb Use native Tamazight muted and notification labels
On 2026-09-14 reuse directly attested native software labels and align notification terminology. Full muted warning remains under review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu cf277e45db Update translation audit for permanent board deletion warning
Record f8a1255dd, dated evidence and verified progress while preserving outstanding language review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 2cb3dad4b4 Translate permanent Tamazight board deletion notice
On 2026-09-14 preserve irreversible deletion and future loss of all lists, cards and actions associated with this board. Full warning and derived agreement remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu db3e1410b2 Record additional import translation repairs and unchanged queue counts
Update dated audit and upcoming changelog for a56e507e9, retaining unresolved language validation.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 883527750f Repair wrong-language Tamazight import labels
On 2026-09-14 replace Kter and Arabic board import labels with native import terminology. Action noun and full command remain low confidence pending native review; these are additional repairs outside the original queue.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 809214006e Correct visually verified dictionary source markers in translation audit
On 2026-09-14 inspected rendered bibliography and authentication/method entries. Correct 105 explanations from extracted MC£ to printed MCΓ, retaining unresolved Moroccan suitability and grammar review. Translation values and progress counts are unchanged.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu f1d99bca43 Update translation audit and upcoming changelog for board analysis repair
Record visual dictionary evidence, unresolved native-language review and verified progress on 2026-09-14.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu c97b1d06b3 Translate Tamazight board structure analysis command
Use visually inspected dictionary letters for Analyze and Structure. Cross-variety terminology, Tifinagh adaptation and complete command remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 884f97fd47 Record board analysis translation candidates and font limits
2026-09-14: Directly inspect dictionary text for Analysis and Structure. Preserve cross-variety source markers and unresolved legacy-font spellings; leave the complete label pending.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 2b33aaf477 Record dated Tamazight authentication label repairs
2026-09-14: Update audit and Upcoming to 15,529 corrected and 315 pending original findings, with 18,104 correction records. Preserve cross-variety provenance and full-language validation scope.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu b91b63c539 Repair Tamazight authentication method labels
2026-09-14: Replace four French labels, preserving method/type, default and display distinctions. Inspected Authentication candidate is cross-variety MC£; script rendering, bound form and full phrases remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 25df941137 Record dated board icon translation repair
2026-09-14: Update audit and Upcoming progress to 15,526 corrected and 318 pending findings, with 18,100 correction records. Preserve full-language validation scope.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 3534bed868 Repair Tamazight board icon drag and open instructions
2026-09-14: Replace French help, retaining drag/drop reordering versus click-to-open behavior. Native Click/Change and existing dictionary terms support components; full instruction remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 6eb79b5948 Record dated clipboard input method translation repair
2026-09-14: Update audit and Upcoming progress to 15,525 corrected and 319 pending findings, with 18,099 records. Preserve source authority limits and full-language review scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 5f73473161 Repair Tamazight clipboard or drag drop label
2026-09-14: Preserve two alternative input methods and the combined drag/drop action. Dictionary Drag and indexed Place support components; full software adaptation and clipboard borrowing remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 1d24a2f163 Record dated Tamazight clipboard action repairs
2026-09-14: Update audit and Upcoming progress to 15,524 corrected and 320 pending findings, with 18,098 records. Preserve Kabyle provenance and open full-language validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 199da35810 Repair Tamazight text and card link clipboard actions
2026-09-14: Replace French and Arabic copy labels, preserving copied object and clipboard destination. Inspected Clipboard candidate is a Kabyle metaphor; borrowing and full command phrases remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 5ec3639818 Record search case translation semantics and evidence limits
2026-09-14: Preserve uppercase/lowercase matching semantics; French typography excerpts and Tifinagh alphabet casing do not establish native software terminology. Leave the full instruction pending.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu a37b573030 Record dated Tamazight Value morphology refinement
2026-09-14: Record indexed Value paradigm correction and unchanged progress counts. Preserve full instruction and wider language validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 333250c882 Refine Tamazight value bound form in format help
2026-09-14: Replace derived uzal with indexed IRCAM Value paradigm wazal. Preserve %{value}, substitution meaning and original French provenance. Direct PDF access failed; full instruction remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 713f3bd0cf Record dated Tamazight separator instruction repair
2026-09-14: Update audit and Upcoming progress to 15,522 corrected and 322 pending findings, with 18,096 records. Preserve cross-variety evidence and open language validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 2b9ecc10cc Repair Tamazight separator space instruction
2026-09-14: Replace French help, preserving both literal HTML space entities and OR. Inspected cross-variety Separator and Space Character candidates support components; full instruction remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu e26a896506 Record dated Tamazight format help translation repair
2026-09-14: Update audit and Upcoming progress to 15,521 corrected and 323 pending findings, with 18,095 correction records. Preserve indexed evidence and full-language validation limits.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu f87013a7a8 Repair Tamazight format placeholder instruction
2026-09-14: Replace French help with in-place-of-value paraphrase preserving %{value}. Native component usage and indexed Format support wording; bound forms and full software instruction remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 6147d00468 Record parent card translation semantics and terminology limits
2026-09-14: Establish display-only No Parent scope from board schema. Avoid deriving singular parent terminology from lexical amawlan or substituting visual position for the actual relationship. Keep full wording review open.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 28af148d3d Record dated workspace icon translation repair
2026-09-14: Update audit and Upcoming progress to 15,520 corrected and 324 pending findings, with 18,094 records. Retain exact cross-variety provenance and open validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu b80086e9f4 Repair Tamazight workspace icon label
2026-09-14: Replace French label and preserve markdown format name. Reuse existing icon and workspace terms; inspected CNAM icon candidate is a starred cross-variety proposal, not normative Moroccan usage. Full wording remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 963bf13ff8 Record dated workspace confirmation translation repair
2026-09-14: Update audit and Upcoming progress to 15,519 corrected and 325 pending findings, with 18,093 correction records. Preserve open language validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 00a9fd000a Repair Tamazight workspace deletion confirmation
2026-09-14: Replace French checkbox text, preserving confirmation action and workspace deletion scope. Native Verify and Deletion support components; full phrase and workspace adaptation remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 68b6885a69 Correct upload repair accounting to unflagged scope
2026-09-14: Authoritative audit progress shows the three upload statuses were outside the original flagged queue. Preserve 15,518 corrected and 326 pending original findings, with 18,092 correction records.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu c38d13cb74 Record dated Tamazight upload translation repairs
2026-09-14: Update audit and Upcoming progress to 15,521 corrected findings and 323 pending. Preserve full-language validation and provenance scope.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 87836f6b50 Repair Tamazight upload statuses and file plurals
2026-09-14: Replace three French upload statuses and refine two earlier file restriction labels with directly attested Files plural. Preserve progress versus failure and upload versus avatar scope. Full status and permission adaptations remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu fc3a655556 Record dated Tamazight file type translation repairs
2026-09-14: Update audit and Upcoming progress to 15,518 corrected findings and 326 pending. Preserve full-language validation limits and remaining restored/provenance review scope.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 1100ace91d Repair Tamazight permitted file type labels
2026-09-14: Replace two Arabic labels while distinguishing upload and avatar file restrictions. Preserve colons. Native Type, File, Permission and Upload support components; plural and full permission constructions remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu d772ca7ec8 Record dated Tamazight Hide All command refinement
2026-09-14: Record stronger command evidence and unchanged progress counts while preserving the open full-language validation scope.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu e79e80afd7 Refine Tamazight hide all checklist items command
2026-09-14: Use directly attested native Hide command, preserving ALL scope and original Arabic provenance. Checklist compound and full noun phrase still require language validation.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 850c60f516 Record dated Tamazight checked-item visibility repair
2026-09-14: Update audit and Upcoming progress to 15,516 corrected findings and 328 pending. Reference the tested local repair; preserve broader validation and low-confidence grammar scope.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 34fa863e55 Repair Tamazight hide checked checklist items label
2026-09-14: Replace Arabic wording, preserving checked-item scope rather than all checklist items. Native Hide and Check roots support components; derived passive plural and full grammar remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu aad5946b49 Record indexed Tamazight format terminology evidence
2026-09-14: Distinguish the indexed Format noun from unverified full placeholder wording. Preserve literal placeholder and HTML space syntax; leave both repairs pending.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu ca784bed85 Record dated field history scope refinement
2026-09-14: Record ee5f6301f with unchanged counts and remaining language validation.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 2192b0428d Clarify Tamazight field history deletion scope
2026-09-14: Repeat future deletion predicate for field history so it cannot attach to the from-all-cards phrase. Preserve original provenance and counts; full grammar remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 4025c170b9 Record dated field deletion translation repair
2026-09-14: Record 1b8797450, 329 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 0108c21939 Repair Tamazight custom field deletion warning
2026-09-14: Preserve no undo, removal from all cards and destruction of field history. Record native components and low-confidence full warning coordination.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 4e1085d903 Record dated failure window translation repair
2026-09-14: Record 7c0384e5a, 330 pending findings and indexed source access limits.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu beac93aaef Repair Tamazight failure counting window label
2026-09-14: Preserve failure time window in seconds, distinct from lockout duration/count threshold. Record native components and low-confidence time-window and error adaptations.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu a828bbe66d Record dated lockout threshold translation repair
2026-09-14: Record ee8fc5f24, 331 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 4cc989bd52 Repair Tamazight lockout failure threshold label
2026-09-14: Preserve failures before lockout as count threshold. Record indexed native Before and error-to-failure adaptation with remaining low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 6622d8ca28 Record dated lockout duration translation repair
2026-09-14: Record 5be2812bd, 332 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu d8cdf1d12f Repair Tamazight lockout duration label
2026-09-14: Preserve lockout duration in seconds, distinct from failure window. Record native duration/block components and low-confidence bound noun and plural.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu f7d61b0320 Record dated field unsetting translation repair
2026-09-14: Record e5cb150bc, 333 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 9659de1718 Repair Tamazight custom field unsetting activity
2026-09-14: Preserve removal of card field value rather than board field definition, with exact placeholders. Record native components and low-confidence technical Value adaptation.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu c3c6eca3a9 Record dated custom field activity translation repair
2026-09-14: Record c45999486, 334 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu fbf2ac1114 Repair Tamazight custom field assignment activity
2026-09-14: Preserve active field name to value assignment in card, exact placeholders and quotes. Record native component evidence and low-confidence technical Set adaptation.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu c6b5055ded Condense recent translation research summary
2026-09-14: Combine seven review paragraphs while retaining detailed source evidence, unresolved requirements and unchanged repair counts.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 9335cea7fd Record dated import activity translation repair
2026-09-14: Record e2cdae25d, 335 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 120dff3100 Repair Tamazight import activity direction
2026-09-14: Preserve active import object, destination and source with exact percent placeholders. Record native import noun and low-confidence derived actor and location grammar.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu b0525246b6 Record dated unchecked item translation repairs
2026-09-14: Record 28c88263f, 336 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu b18cfb5d49 Repair Tamazight unchecked item activities
2026-09-14: Preserve active removal of checkmark and exact percent placeholders, distinct from state or item deletion. Record native components and low-confidence mark nominalization and relations.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu e7acf89e9e Record dated checked item translation repairs
2026-09-14: Record dccca19d4, 338 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 32125b9797 Repair Tamazight checked item activities
2026-09-14: Preserve active checkbox checking, checklist/card relations and exact percent placeholders. Record native checkbox evidence and low-confidence actor and full grammar.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu b74b5a4f6d Record dated subtask destination translation repair
2026-09-14: Record 73b5d0eed, 340 pending findings and indexed evidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 9453634410 Repair Tamazight subtask deposit destination label
2026-09-14: Preserve hierarchical subtasks and this-board destination. Record indexed native Place imperative and failed direct access; full software adaptation remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 9487c3d4c0 Record migration waiting terminology source limits
2026-09-14: Distinguish regional Wait/Hope polysemy and failed direct PDF inspection. Preserve full pending migration progress scope and unchanged counts.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 132d56dfa1 Record WIP comparative source context limits
2026-09-14: Distinguish Vietnamese and aged-man examples from native numeric Higher terminology. Preserve pending WIP guidance and unchanged counts.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu d0d6c63ada Record WIP translation scope from actual controls
2026-09-14: Verify Tasks counts list cards and preserve alternative move-out or higher-WIP remedies. Keep unresolved terminology pending without changing values or counts.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 4172d4c2db Record search limit source help discrepancy
2026-09-14: Verify zero means no limit in actual parser despite positive-integer English help. Preserve locale source meaning and reject font choice as regional terminology proof.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu e873f3d955 Record integer vocabulary retrieval evidence limits
2026-09-14: A failed PDF fetch cannot prove Integer or Positive entries absent. Preserve pending messages and direct subsequent research toward mathematical vocabulary.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu e81b5b416f Record Tamazight search integer terminology review
2026-09-14: Preserve positive integer and per-page scope while recording indexed Number evidence and cross-region source limits. Values and pending counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 4ecccdabcb Record dated imported board agreement refinement
2026-09-14: Record 7525d9271 and preserve unchanged counts and language confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 4f7d7b69cb Refine Tamazight imported board relative agreement
2026-09-14: Remove masculine actor prefix from the passive relative modifying feminine Board. Preserve original correction provenance and counts; derived agreement remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 5c77611d7f Record dated member mapping fallback repair
2026-09-14: Record 77a0023cc, 341 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 2dba939233 Repair Tamazight unmapped member fallback note
2026-09-14: Preserve future assignment of unmapped members to current user. Record native components and low-confidence fallback composition.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu fe203ed673 Clarify Tamazight mapping source provenance
2026-09-14: Distinguish association relative from Continue homograph and retain low confidence for derived mapping imperative. Correct Copy evidence key. Values and original counts unchanged; correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 75059aa5d1 Record dated board member mapping translation repair
2026-09-14: Record a9c0a3a55, 342 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu d54c1674a1 Repair Tamazight imported board member mapping
2026-09-14: Preserve your imported board having some members and mapping selected members to your users. Record native components and low-confidence association and import grammar.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu daf67dea28 Record invitation source retrieval limits
2026-09-14: Independent normalized/indexed URL retrieval fails certificate-chain verification. Record that no PDF was inspected and preserve pending status; other repairs remain actionable.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 2c0c0d531d Record Tamazight invitation evidence review
2026-09-14: Record indexed parallel IRCAM invitation and failed direct fetch. Preserve pending status because Welcome does not prove Invited and the exact native wording remains uninspected.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 1a6f74c431 Record dated card completion translation repair
2026-09-14: Record e091ab50d, passing checks and remaining confidence limits. Original findings counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 2b685ef724 Repair Tamazight card checklist completion activity
2026-09-14: Replace unflagged Kabyle-seeded wording, preserving active completion and all five location placeholders. Record native completion evidence and remaining low-confidence grammar.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu ebf63955c1 Record dated checklist reversal translation repairs
2026-09-14: Record bc0e7f13a, 343 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 6600574f5f Repair Tamazight checklist uncompletion activities
2026-09-14: Preserve active undoing of checklist completion and exact percent placeholders. Native edit reversal supports Undo, while derived actor, completion noun and full checklist wording remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu f39386456c Record dated imported member translation repair
2026-09-14: Record 4ee286985, 345 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu e5116be843 Repair Tamazight imported member user selection
2026-09-14: Preserve selection of your existing user to use as this member. Record native components and low-confidence existence and use-as composition.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 0ae4a1fcca Record dated list archive translation repair
2026-09-14: Record f827f29de, 346 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 8e8782eaa8 Repair Tamazight list card archive instructions
2026-09-14: Preserve all cards of this list removed from the board and return from Archive via matching menu labels. Record native components and low-confidence full coordination; archiving remains distinct from permanent deletion.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu eb340b94ee Record dated board import translation repairs
2026-09-14: Record 6800bb1ec and 347 pending findings with native component evidence and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu df83b65435 Repair Tamazight board export import instructions
2026-09-14: Align Menu and Export Board controls with repaired import instructions. Preserve your board, ordered navigation and copying text from the downloaded file. Record native component sources and low-confidence derived morphology and sequence.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu fd0ea8c51e Correct stale translation progress description
2026-09-14: Match TODO Later text to linked leave-board repair 8a9719417, preserving counts and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 61e5f47e9a Record dated leave-board translation repair
2026-09-14: Record 8a9719417 and 348 pending findings, preserving evidence limits and remaining language validation.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 2a486083be Repair Tamazight leave-board membership warning
2026-09-14: Replace wrong-language label and confirmation. Preserve board-title placeholder and future removal of the current user from all cards on this board. Record native components and low-confidence membership adaptation and grammar.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu a04a2dc63f Record dated board deletion translation repair
2026-09-14: Record 4a03ba96c and 349 pending findings with source limits and remaining validation.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu bf88de4003 Repair Tamazight permanent board deletion warning
2026-09-14: Preserve every deleted content category, future inability to recover board contents and unconditional no-undo warning. Record native components and low-confidence grammatical composition.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu bee5f38ef2 Record dated notification translation repair progress
2026-09-14: Record local repair 7caee4baa, 350 pending findings and passing correction checks. Preserve language confidence limits and remaining restored/unflagged validation.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu d256aea927 Repair Tamazight notification deletion confirmation
2026-09-14: Replace French confirmation and align the related notification label. Preserve all notifications and unconditional inability to undo. Native component evidence is recorded; composed confirmation and action agreement remain low confidence. Update the older notification regression to match reviewed terminology.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 1879ec8bf9 Record checklist checkbox translation repair progress
2026-09-14: Record fee3de6db, check/uncheck scopes and remaining language validation. Update audit to 15,493 corrected and 351 pending, including 216 Tamazight. All 18,060 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 31b741b52d Repair Tamazight checklist check and uncheck controls
2026-09-14: Replace three French values preserving Hide checked items, Check ALL items OF A LIST and active Uncheck ALL reversal. Native checkbox/hide/remove components support provisional wording; nominalization, passive and full grammar remain low confidence. All 18,060 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 67e76f8a83 Record migration control translation repair progress
2026-09-14: Record 371ccad6b, operation/scope distinctions and remaining language validation. All 18,057 correction checks and three metadata suites pass; original counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 8188521840 Repair Tamazight migration start and pause controls
2026-09-14: Repair six unflagged values preserving Start/Pause, ALL/singular scope and failed/completed statuses. Native components support provisional wording; migration and derived grammar remain low confidence. Stop remains distinct and awaits review. All 18,057 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 4ab1e95dd9 Record migration label translation repair progress
2026-09-14: Record df6e03f46, scheduling/resume distinctions and remaining language validation. All 18,051 correction checks and three metadata suites pass; original counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 7f4ce06024 Repair Tamazight migration scheduling and resume wording
2026-09-14: Repair four unflagged labels preserving Scheduled plural versus Automatic singular and Resume versus Complete. Native Red Moon/Dialect components support provisional wording; migration adaptation and derived grammar remain low confidence. All 18,051 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 62ae602ab4 Record worker role translation repair progress
2026-09-14: Record cda2d947b, restricted permission scope and remaining language validation. Update audit to 15,490 corrected and 354 pending, including 219 Tamazight. All 18,047 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 021a8fe977 Repair Tamazight worker role permission description
2026-09-14: Replace French preserving ONLY move cards, SELF-assignment and comment permissions. Native components support provisional wording; self-assignment paraphrase and whole grammar remain low confidence. All 18,047 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu f6e2a52f5a Record watcher explanation translation repair progress
2026-09-14: Record c002054d5, preserved notification scope and remaining language validation. Update audit to 15,489 corrected and 355 pending, including 220 Tamazight. All 18,046 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 8114b5a87b Repair Tamazight board watcher explanation
2026-09-14: Replace French while preserving future YOU notification for ANY change on THIS board. Native notification/each/sent-to-you components support provisional wording; feminine plural passive and full grammar remain low confidence. All 18,046 correction checks pass; fluent/browser validation remain open.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 13cd12eb0c Record All predicate repair and reference access limits
2026-09-14: Record 5e5519f2f, exact native evidence and single-token tests. Keep pending date-boundary and uncertain mention wording open; additional IRCAM PDF could not be inspected. All 18,045 correction checks and three metadata suites pass; original counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 3ed703f5a0 Repair Tamazight All search predicate
2026-09-14: Replace Arabic with exact native MediaWiki All, preserving single-token query format. Add exact-value and negative whitespace/colon regression coverage. All 18,045 correction checks pass. Date-boundary wording remains pending.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 8ca9371260 Record swimlane search repair and date boundary review
2026-09-14: Record 9daf257e4, preserved syntax and pending date boundary wording. Update audit to 15,488 corrected and 356 pending, including 221 Tamazight. All 18,044 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 5164786769 Repair Tamazight swimlane title search instruction
2026-09-14: Replace French preserving exact query parameter, cards IN swimlanes and specified title matching. Native Matching/Title/Given components support provisional wording; Swimlane-as-Path, specified adaptation and full grammar remain low confidence. Days-ago-or-less findings remain pending.

All 18,044 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 71b8294156 Record search scope translation repair progress
2026-09-14: Record 3f2d9c726, preserved search scopes and remaining language validation. Update audit to 15,487 corrected and 357 pending, including 222 Tamazight. All 18,043 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu d9570ea4d1 Repair Tamazight search scopes and archive defaults
2026-09-14: Replace three French values preserving default archive exclusion, ALL archived AND unarchived cards, predicate token, and title/description/custom-field scope on THIS board. Native components support provisional wording; passive/plural/full grammar remain low confidence. All 18,043 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu b6667021e0 Record group search translation repair progress
2026-09-14: Record e0f16c497, metasyntax preservation and remaining language validation. Update audit to 15,484 corrected and 360 pending, including 225 Tamazight. All 18,040 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 30973c6c89 Repair Tamazight organization and team search prose
2026-09-14: Replace French prose while preserving exact query metasyntax and cards belonging to a board assigned TO organization/team. Native Given and local group terms support provisional wording; relative passive, assignment adaptation and whole grammar remain low confidence. All 18,040 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 4069c747be Record search role translation repair progress
2026-09-14: Record 129fa829e, syntax preservation and remaining language validation. Update audit to 15,482 corrected and 362 pending, including 227 Tamazight. All 18,038 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 48b3fd33d9 Repair Tamazight assignee and user search instructions
2026-09-14: Replace French while preserving operator tokens, colon, repeated username parameter and emphasis. Assignee-only versus member OR assignee scopes remain distinct. Reuse native Username and existing local role paraphrases; full grammar remains low confidence. All 18,038 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 714b807662 Record card mention translation repair progress
2026-09-14: Record 1493cc244, preserved placeholders and indexed evidence limits. Update audit to 15,480 corrected and 364 pending, including 229 Tamazight. All 18,036 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 2842bbc987 Repair Tamazight card mention activity translation
2026-09-14: Replace French while preserving mentioned YOU, card/comment/list/swimlane/board and all five exact placeholders. Indexed IRCAM mention entry supports a provisional verb; PDF redirects to HTML and full wording remains low confidence. Native Mastodon person-directed activity supports object component only.

All 18,036 correction checks pass; fluent and browser validation remain open.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu a83431635d Record board role translation repair progress
2026-09-14: Record 381d18eb3, permission scopes and remaining low-confidence validation. Update audit to 15,479 corrected and 365 pending, including 230 Tamazight. All 18,035 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 0524017b8e Repair Tamazight board role permission descriptions
2026-09-14: Replace French administrator and Arabic normal-member descriptions and Activities label. Preserve card view/edit, member removal, board settings and activity view permissions, including normal-member inability to change settings. Native UI components support wording; full grammar and activity-log adaptation remain low confidence.

All 18,035 mechanical correction checks pass. Fluent and live browser validation remain open.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu ec6108908b Record Home translation repair and restore instruction review
2026-09-14: Record f903af89d and direct native Home evidence. Preserve unresolved full archive restoration wording and complete audit scope. All 18,032 correction checks and three metadata suites pass; original counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 51f38c9a05 Repair Tamazight Home navigation label
2026-09-14: Replace Arabic with exact native Mastodon Home label, corroborated by MediaWiki Home-page wording. Full archive restoration instruction remains pending; standalone label evidence does not prove header/button wording. All 18,032 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 168ddd4060 Record checkbox instruction translation repair progress
2026-09-14: Record repair 7d1e0ef15, component evidence and low-confidence grammar. Update audit to 15,477 corrected and 367 pending, including 232 Tamazight. All 18,031 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu a7f5c5c871 Repair Tamazight board selection checkbox instruction
2026-09-14: Replace French while preserving checkbox click and board selection. Native MediaWiki supports checkbox and selection components; compound, plural and full instruction remain low confidence. All 18,031 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 8b50e3851a Record failed migration retry translation repair progress
2026-09-14: Document repair 7dcaf17cf, native component evidence and remaining low-confidence language validation. Update original audit counts to 15,476 corrected and 368 pending, including 233 Tamazight.

All 18,030 correction checks and three audit/changelog suites pass. Restored values, unflagged strings and earlier uncertain wording remain in scope. No remote uploads performed.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu db12dfa7a0 Repair Tamazight failed migration retry messages
2026-09-14: Replace three French values while preserving failed migration scope, Retry versus Resume, successful retry notification and no failed migrations to retry.

Native Mastodon and non-fuzzy Dialect support components. Migration adaptation, derived plural/passive grammar and full wording remain low confidence. All 18,030 mechanical correction checks pass; fluent and live browser validation remain open.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu f7492a25da Record scheduled job deletion translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for bc7b01940 with verified inventory and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu f745b5304f Repair Tamazight scheduled job deletion and pause messages
2026-09-14: Preserve Delete versus Pause, this scheduled job confirmation and success versus failure in five unflagged values. Job adaptation and derived grammar remain low confidence.

Validation: 18,027 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 2b6f88d4e8 Record scheduled job translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 7a49eb16b with verified counts and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 496b434235 Repair Tamazight scheduled job labels and status messages
2026-09-14: Preserve Add, active/plural job scope, Resume versus Start and success versus failure. Seven French values repaired; scheduled-job adaptations and derived grammar remain low confidence.

Validation: 18,022 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 8201419bad Record migration resume translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 34a98e0d1 with verified counts and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 93ffecca2c Repair Tamazight migration resume and error status text
2026-09-14: Preserve paused-migration scope, no paused items, successful resumption and all-errors-cleared meaning. Four French findings repaired; derived passives and migration terminology remain low confidence.

Validation: 18,015 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 46f5661cec Record settings translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 10b082127 with verified inventory and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu b8d1e0b6e3 Repair Tamazight settings navigation and save status
2026-09-14: Preserve Team settings, return/save actions and S3 success versus failure in five labels. Success uses completed Saved notification. Derived save noun, passive agreement and full phrases remain low confidence.

Validation: 18,011 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 888a57229d Record star selection translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for c82cef74f, verified correction count and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 9942022321 Repair Tamazight star selection and empty state controls
2026-09-14: Preserve selected boards, star/unstar, all starred items and not-yet-anything meaning in six unflagged values. Passive and negative grammar, star adaptation and swimlane term remain low confidence.

Validation: 18,006 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 5fc27a7f7e Record starred item translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for d6a73fae4, verified counts and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 7e229b64c4 Repair Tamazight starred board and page controls
2026-09-14: Preserve star/unstar, board/page distinctions, top-of-your-boards-list location and count placeholder in nine labels. Star vocabulary reuse and full grammar remain low confidence.

Validation: 18,000 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu bbb7f9ce1f Record due-time translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 9af74b9d0, verified counts and explicit native validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu f9534f3667 Repair Tamazight due-time activity text
2026-09-14: Preserve new due time, When/Where labels, previous due value, four-line layout and exact placeholders. Actor past, deadline compound and full grammar remain low confidence.

Validation: 17,991 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu fc57c752f0 Record board information translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 2557151f0, verified counts and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 423eb10518 Repair Tamazight board duplicate and information labels
2026-09-14: Preserve duplicate-this confirmation, all-board settings scope and Board/List/Swimlane information tuple. Four wrong-language labels repaired; assembled phrases and swimlane adaptation remain low confidence.

Validation: 17,990 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 7859e80f9d Record template container translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 6c1388962 with verified counts, source semantics and explicit confidence limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu a6e7d0e549 Repair Tamazight template container and copy controls
2026-09-14: Preserve container distinction and Copy Template to Many Cards versus Copy Checklist from Template. Six French/mixed values repaired. Container adaptation, checklist noun and full grammar remain low confidence.

Validation: 17,986 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 43b7226333 Record template translation terminology repairs
2026-09-14: Update upcoming changelog and audit evidence for 747e1d96e, distinguishing unflagged repairs from original counts and preserving validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 8efe266378 Repair Tamazight template labels and save action
2026-09-14: Use directly attested Template component for seven labels, including Save as Template previously using Subject. Preserve Add/Create and card/list/board scopes. Plurals and full phrases remain low confidence.

Validation: 17,980 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 7c4feba4d5 Record translation warning and count repair progress
2026-09-14: Update upcoming changelog and audit evidence for 1f30de7d6 with verified counts and native validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu e612c7e7a3 Repair Tamazight translation deletion warning and count
2026-09-14: Preserve deletion confirmation, this/custom scope, no-undo warning and count punctuation. Two Arabic values repaired; derived text plural and full grammar remain low confidence.

Validation: 17,973 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu a5ea88123b Record custom translation control repair progress
2026-09-14: Update upcoming changelog and audit evidence for 67e2d101b, verified counts and remaining language validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 17363c5320 Repair Tamazight custom translation controls
2026-09-14: Replace five Arabic labels using non-fuzzy native Translation evidence. Preserve new/edit/delete-this actions, custom scope and question mark. String-to-text adaptation and modifier attachment remain low confidence.

Validation: 17,971 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu fad15cae03 Record archive title translation review progress
2026-09-14: Update upcoming changelog and audit evidence for 148e72446, including original versus unflagged repair counts and language validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 0f5c6a7da6 Repair Tamazight archive states and recovery titles
2026-09-14: Preserve archive states, restoration destinations and search placeholder. Repair seven labels; full clauses, passive recovery and provisional swimlane term remain low confidence.

Validation: 17,966 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 630ba02a1a Record archive guidance translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for a2a88d405 with verified counts and explicit language validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu d354958820 Repair Tamazight archive visibility and recovery guidance
2026-09-14: Preserve post-archive locations, later restoration through Board Settings and activity retention. Seven wrong-language findings repaired; assembled clauses and swimlane terminology remain low confidence.

Validation: 17,959 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 270440bcec Record archive and restore translation scope repairs
2026-09-14: Update upcoming changelog, audit counts and evidence for a9e68b414. Changelog and audit regression tests pass; native validation remains incomplete.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 64905b0d62 Repair Tamazight archive and restore scope controls
2026-09-14: Preserve swimlane movement, all cards in this list and restore-all scope. Full phrases and swimlane terminology remain low confidence. Keep the existing generic Restore alternative.

Validation: 17,952 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu e66ff03e19 Update upcoming changelog and translation audit progress
2026-09-14: Record archive alternative and native control repairs in 14c2b82da, verified counts and remaining language validation. Changelog and audit regression tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 185787ca0e Repair Tamazight archive alternative and native controls
2026-09-14: Preserve the list archive alternative and activity retention; replace inherited Kabyle Save and Search controls with attested native labels. The assembled archive hint remains low confidence.

Validation: 17,948 correction checks pass, including placeholders, formatting and newer translation preference.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu e49c58fbb9 Record archive activity translation repair progress
2026-09-14: Record dce7f41cd, preserved placeholders and low-confidence clauses. Refresh audit and upcoming changelog; original counts unchanged. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 38cd067136 Repair Tamazight archive activity vocabulary
2026-09-14: Replace inherited Kabyle-leaning archive wording in four activities, preserving objects, nested locations, completed movement and exact placeholders. Latin script alone is not treated as an error. Passive forms, swimlane adaptation and whole clauses remain low confidence.

Validation: 17,945 correction checks pass, preserving translation preference.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 2c3786fdbc Record archive confirmation translation repair progress
2026-09-14: Record 66c5df4fe, preserved intent/placeholders and low-confidence wording. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu bac0f55782 Translate Tamazight archive confirmation and activity
2026-09-14: Replace three French/Arabic values. Preserve confirmation intent, this-board scope, question marks and exact %s placeholder. Native software supports the confirmation frame; derived verbs and full clauses remain low confidence.

Validation: 17,941 correction checks pass, including placeholders and translation preference.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu da914e5a50 Record archive rule translation repair progress
2026-09-14: Record cbc2bf400, preserved action/state scopes and low-confidence grammar. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu e6d350b6d2 Translate Tamazight archive rule actions and states
2026-09-14: Replace seven Arabic/French labels. Preserve Move to versus Restore from Archive, card scope and completed states. Native MediaWiki attests action verbs; full clauses and passive states remain low confidence for native review.

Validation: 17,938 correction checks pass; placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 9b22e53ea9 Record archive state translation repair progress
2026-09-14: Record 38debcc33, preserved scopes and low-confidence grammar. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu a22c15f1c6 Translate Tamazight archive status and empty states
2026-09-14: Replace seven Arabic/French values. Preserve board/list/card negative scopes, singular this-board moved status, and warning that the list containing this card is archived. Derived forms and full clauses remain low confidence for native review.

Validation: 17,931 correction checks pass, preserving placeholders and translation preference.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 264d77a04d Record direct archive noun provenance review
2026-09-14: Record fbe388603 and distinguish inspected native logo evidence from French body text. Counts unchanged; full labels remain low confidence. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu bee9ec4744 Corroborate Tamazight archive noun from institutional logo
2026-09-14: Inspect the native Archives du Maroc logo embedded on page 1 of a University Mohammed V press release. Add direct lexical provenance to nine archive records; French body text is not native evidence. Full kanban labels remain low confidence.

Validation: all 17,924 correction checks pass; no values or counts changed.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 6234d76bf1 Record archive translation repair progress
2026-09-14: Record 5dca9f38d, indexed evidence limits and low-confidence full phrases. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 90e738a83b Translate Tamazight archive controls
2026-09-14: Replace nine Arabic/French labels with Archive and Move-to-Archive wording, preserving all, board, card, list and selection scopes. Ministry indexed institutional archive terminology supports the noun; direct page access timed out. Full labels remain low confidence for native review.

Validation: 17,924 correction checks pass; placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 6b27f538db Record assignee recipient translation review
2026-09-14: Record 0488199cf, preserved original provenance and explicit recipient wording. Counts unchanged; grammar remains low confidence. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 0914e764be Clarify Tamazight assignee filter recipient wording
2026-09-14: Refine two earlier filter labels with an explicit To whom recipient and feminine card passive, matching the assignee labels. Preserve No assignee and original French provenance. Relative grammar and responsibility paraphrase remain low confidence for native validation.

Validation: all 17,915 correction checks pass; counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 08757e2a6e Record assignee scope translation repair progress
2026-09-14: Record 2e15e9f7b, preserved scopes and low-confidence grammar. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 012a78b69b Translate Tamazight assignee labels and card scopes
2026-09-14: Replace five French labels. Preserve singular/plural, No assignee and all-cards versus current-card board scope. Responsibility paraphrases, relative clauses and derived forms remain low confidence for native review.

Validation: 17,915 correction checks pass; placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu fe6a1421fc Record assigned role translation repair progress
2026-09-14: Record 13f8fbd14, preserved capability scopes and low-confidence wording. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 3843b82af5 Translate Tamazight assigned card permission labels
2026-09-14: Replace six French role labels and descriptions. Preserve assigned-only visibility and distinct normal editing, read cannot edit and comment-only capabilities. Derived forms, assignment paraphrase and complete clauses remain low confidence for native validation.

Validation: 17,910 correction checks pass, including placeholders and translation preference.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu e62b1e0a3b Record filter translation repair progress
2026-09-14: Record 5da9a2084, preserved scopes and low-confidence wording. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu a3fbbc9ba1 Translate Tamazight filter controls and status
2026-09-14: Replace seven Arabic/French labels. Preserve member versus assignee, negative scopes, other filters and active-filter edit instruction. Derived forms, responsibility paraphrase and full clauses remain low confidence for native validation.

Validation: 17,904 correction checks pass; placeholders and newer translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu a09730776a Record time tracking translation repair progress
2026-09-14: Record 9f60960f4, preserved scopes, native Hour evidence and low-confidence full phrases. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 3c2b1bbfdf Translate Tamazight time tracking labels
2026-09-14: Replace five Arabic/French labels, preserving spent versus overtime, hours units and card-presence scope. Native CLDR supports Hour; derived forms and full time-tracking paraphrases remain low confidence for native review.

Validation: 17,897 correction checks pass; placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 7435d38694 Record account and starred label repair progress
2026-09-14: Record 47758fc61, three unflagged repairs, direct native action/noun evidence and low-confidence starred compounds. Original counts unchanged. Correction checks and all three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 11c943dcf7 Repair Tamazight account and starred item labels
2026-09-14: Replace two Arabic labels and repair the unflagged starred-list noun. Create Account is directly attested in native MediaWiki; Lists is directly attested in native Mastodon. Starred compounds remain low confidence for native validation.

Validation: 17,892 correction checks pass, preserving placeholders and newer translation preference.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu e417ffc136 Record membership shortcut translation repair progress
2026-09-14: Record cffc0bd98, distinct scopes and low-confidence assignment adaptation. Refresh audit and upcoming changelog counts. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 845c624f0b Translate Tamazight membership and assignment shortcuts
2026-09-14: Replace four Arabic/French labels while preserving membership versus assignment, current-card scope and distinct filters. Assignment paraphrase, derived forms and full clauses remain low confidence for native review.

Validation: 17,889 correction checks pass; source placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 4658bdab29 Record sidebar translation repair progress
2026-09-14: Record abaa87ed9, action evidence and low-confidence noun paraphrases. Refresh audit counts and upcoming changelog. All correction checks and three summary checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 2eb31cb56d Translate Tamazight sidebar and dialog controls
2026-09-14: Replace six Arabic/French controls. Preserve open, close, and show/hide actions and distinct filter, search and board sidebar scopes. Native software supports action verbs; panel/dialog paraphrases and full grammar remain low confidence for review.

Validation: 17,885 correction checks pass, including tokens, JSON examples and newer translation preference.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu d193ce839c Record autocomplete translation repair progress
2026-09-14: Record e5625d884, native component evidence, provisional compounds and remaining validation scope. Update short audit and upcoming changelog. All correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 88af035864 Translate Tamazight autocomplete shortcut labels
2026-09-14: Replace two Arabic labels while preserving automatic completion and emoji/member targets. Derive provisional completion wording from native software components; full compounds and reused member terminology remain low confidence for native review.

Validation: 17,879 correction checks pass; placeholders, JSON examples and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 8f1aed0ef3 Record Tamazight shortcut translation repair progress
2026-09-14: Record source commit 786d29cfb, native software evidence, low-confidence grammar and remaining validation scope. Refresh audit counts and upcoming changelog. Correction checks and all three summary checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu aa47320106 Translate Tamazight shortcut list action
2026-09-14: Replace Arabic shortcut-list wording using native Dialect keyboard shortcut terminology. Preserve the show-this-list action. Full assembled wording remains low confidence pending language validation.

Validation: 17,877 correction checks pass, including placeholder and translation-preference checks.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu bd96ae179b Record attested Paste translation refinement
2026-09-14: Update audit and upcoming notes with stronger native lexical evidence for two import hints. Preserve full-phrase review scope and original provenance; three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 075e8718de Use attested Tamazight Paste terminology in import hints
2026-09-14: Replace the earlier tentative Paste verb in two hints with a directly attested native Dialect control. Preserve original provenance and format identifiers. Full phrases remain low confidence; all 17,876 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 0078b9c67b Record structured-data import translation progress
2026-09-14: Update audit and upcoming notes with two Tamazight import hint repairs, evidence limits and remaining scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 73bbc6bafc Translate Tamazight structured-data import hints
2026-09-14: Replace two French hints while preserving Paste your valid data here and literal CSV/TSV or JSON. Paste terminology and full phrasing remain low confidence. All 17,876 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu facd5077dd Record stop translation repair progress
2026-09-14: Update audit and upcoming notes with two unflagged Tamazight stop repairs and remaining terminology review. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu b274ed118b Translate Tamazight stop command and migration progress
2026-09-14: Replace French Stop and Stopping text using native app evidence. Preserve command versus progress; derived full clause and lexical pause/stop overlap remain for fluent review. All 17,874 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 5503a1f9b1 Record resume migration translation progress
2026-09-14: Update audit and upcoming notes with the unflagged Tamazight Resume control repair and remaining review limits. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 9e1adc713e Repair Tamazight resume migration control
2026-09-14: Use directly attested native Resume terminology for the migration control, preserving resumption rather than completion. Full phrase remains low confidence; all 17,872 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 3a86582d4b Record migration pause translation progress
2026-09-14: Update audit and upcoming notes with pause-state repairs, evidence limits and remaining review scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu f5862acbda Translate Tamazight migration pause states
2026-09-14: Repair Pausing and Paused using native app pause evidence, retaining progress versus paused state. Derived plural clauses remain low confidence. All 17,871 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu c48e416784 Record migration starting translation progress
2026-09-14: Update audit and upcoming notes with the Tamazight migration progress repair, source evidence limits and remaining scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu e5628a3339 Translate Tamazight migration starting progress
2026-09-14: Replace French progress text using native Start evidence. Preserve ongoing starting, plural migrations and ellipsis; derived passive and full clause remain low confidence. All 17,869 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 01b54285ad Record rule actor translation repair progress
2026-09-14: Update audit and upcoming notes with the unflagged Tamazight rule qualifier repair and remaining review scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 638efa8aef Translate Tamazight rule actor qualifier
2026-09-14: Replace French By qualifier before the rule user field. Complete assembled predicate grammar remains low confidence. All 17,868 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu fdd7668b51 Record logo translation provenance review progress
2026-09-14: Update audit and upcoming notes with clarified dictionary authority for prior Tamazight logo repairs. Preserve remaining review scope; three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu af533b8526 Clarify Tamazight logo dictionary provenance
2026-09-14: Apply the inspected cross-variety dictionary preface to two earlier logo correction records. Preserve independent native caption evidence and low confidence; no values/counts changed. All 17,867 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 8fc830aceb Record original-order translation repairs and evidence limits
2026-09-14: Update audit and upcoming notes with repaired ordering guidance and the dictionary cross-variety preface. Preserve low-confidence review scope; three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 63850d0622 Translate Tamazight original-order checklist guidance
2026-09-14: Replace two Arabic values while retaining original ordering and one item per line. Dictionary preface confirms cross-variety proposals; terminology and full wording remain low confidence. All 17,867 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu f814259071 Record translation conversion review progress
2026-09-14: Update audit and upcoming notes with native evidence limits for the uncertain Tamazight conversion verb. Preserve remaining repair scope; three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 06fc5be68b Record Tamazight conversion verb evidence limits
2026-09-14: Distinguish native Return/date-back usage from the proposed checklist conversion verb. Preserve low confidence and the unresolved original-order constraint; no values or counts changed. All 17,865 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu fcb2702b82 Record each-line checklist translation progress
2026-09-14: Update audit and upcoming notes with the Tamazight guidance repair, evidence limits and remaining scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu b2f402fb79 Translate Tamazight each-line checklist guidance
2026-09-14: Replace Arabic guidance while preserving each line becoming one checklist item. Derived Become and full wording remain low confidence; the original-order variant needs separate review. All 17,865 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu ecba5091df Record checklist text editor translation repair
2026-09-14: Update audit and upcoming notes with the unflagged Tamazight title correction, evidence limits and remaining scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 2f7ea0f780 Repair Tamazight checklist text editor title
2026-09-14: Remove the inherited First qualifier absent from English and preserve editing checklist items as text. Native component evidence supports Edit and Items; full phrase remains low confidence. All 17,864 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 05a4b333e7 Record date rule translation repair progress
2026-09-14: Update audit and upcoming notes with two unflagged Tamazight date condition repairs, remaining review limits and verified counts. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 2521b7092a Translate Tamazight start and end date rule conditions
2026-09-14: Replace mixed-language conditions and restore When and Set or Changed alternatives. Preserve distinct start and end dates. Set adaptation and full grammar remain low confidence; all 17,863 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 2631b7b167 Record checklist line hint translation progress
2026-09-14: Update the audit and upcoming notes with the Tamazight line-to-item repair, source evidence limits and remaining counts. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu e548b250d5 Translate Tamazight checklist line-to-item hint
2026-09-14: Replace Arabic bulk-entry guidance using native textual Line and Text evidence. Preserve one line equals one checklist item. Full wording remains low confidence; all 17,861 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu ba0a73ce22 Record checklist rule translation repair progress
2026-09-14: Update upcoming notes and audit counts for four repaired Tamazight rule prefixes and their remaining terminology review. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 479fbd178d Translate Tamazight checklist rule condition prefixes
2026-09-14: Replace four French prefixes while distinguishing generic and named checklists and items. Native temporal When evidence supports the prefix; checklist terminology and assembled grammar remain low confidence. All 17,860 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu b5d7beed00 Record custom login logo text translation progress
2026-09-14: Update the translation audit and upcoming release with the repaired Tamazight label, source commit and remaining review counts. All three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 878bbd2b50 Translate Tamazight text below custom login logo
2026-09-14: Replace the French label with Tamazight using native Text, Below, Logo and Login evidence. Full noun-chain grammar remains low confidence. All 17,856 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 9799227683 Update upcoming release and translation repair progress
2026-09-14: Record custom login logo URL repairs, native terminology evidence and remaining review scope. Changelog and audit progress checks pass. The upcoming release retains the verified wekan22 build repair and Linux arm64 build log.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 3845b24a5d Translate Tamazight custom login logo URLs
2026-09-14: Replace French labels preserving image/link distinction and URL. Logo has directly labelled zgh community caption evidence; normative authority, bound forms and full phrases remain low confidence. All 17,855 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu bb55423501 Record software completion review progress
2026-09-14: Update Audit, TODO Later and Upcoming with 4139001a3 native software evidence and remaining grammar/terminology review. Values/counts unchanged. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu dd797e68b6 Record native transitive software completion evidence
2026-09-14: MediaWiki resetpass_announce directly supports complete login beyond temporal ending/legal supplementation. Past actor form and full checklist grammar remain low confidence. Record login noun and unresolved logo terminology. Values/counts unchanged; 17,853 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu d9365ae9a1 Record custom HTML tag translation repairs
2026-09-14: Record a536b274a, 15,396 corrected originals, 448 pending findings and 17,853 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 29e4bcc1c0 Translate Tamazight custom HTML tag labels
2026-09-14: Replace French labels preserving plural tags, custom scope, HTML and link/meta element identifiers. Technical semantic extensions and full phrases remain low confidence. All 17,853 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 11e5e004ee Record minicard checklist display translation repair
2026-09-14: Record 02cdb84f3, 15,394 corrected originals, 450 pending findings and 17,851 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu b701a697de Translate Tamazight minicard checklist display control
2026-09-14: Replace French Show Checklist at Minicard preserving display action and minicard scope. Proposed checklist/minicard phrases remain low confidence. All 17,851 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu d121156672 Record checklist completion review limits
2026-09-14: Update Audit, TODO Later and Upcoming with 9de9f2c15 source-context evidence and remaining completion-validation requirements. Values/counts unchanged. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu c3c60cd4ca Clarify Tamazight checklist completion evidence
2026-09-14: Record native legal supplementation uses of completion root without treating them as proof of past transitive checklist completion. Preserve existing values, counts and low-confidence status. All 17,850 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu e915076de6 Record finished checklist visibility translation repair
2026-09-14: Record bd511b086, 15,393 corrected originals, 451 pending findings and 17,850 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 292b623e5f Translate Tamazight finished checklist visibility control
2026-09-14: Replace Arabic control preserving Hide and finished-checklist restriction. Derived relative grammar and full phrase remain low confidence for fluent review. All 17,850 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 8a1f9fc1ea Record checklist form translation repairs
2026-09-14: Record a8ac930ee, 15,392 corrected originals, 452 pending findings and 17,849 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu b07cbe95aa Translate Tamazight checklist form close controls
2026-09-14: Replace French controls preserving Close Form rather than executing Add/Edit. Derived addition noun and full checklist phrases remain low confidence. All 17,849 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu b701a9f217 Record completed checklist translation repair
2026-09-14: Record 2544843d6, 15,390 corrected originals, 454 pending findings and 17,847 correction records in Audit, TODO Later and Upcoming. Preserve semantic distinctions and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu e396b633d6 Translate Tamazight completed checklist activity
2026-09-14: Replace French activity preserving checklist completion and two ordered %s tokens. Transitive past-completion adaptation and full phrase remain low confidence. Uncompletion requires active reversal wording, not simple negation. All 17,847 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 556b9cf14d Record checklist activity translation repairs
2026-09-14: Record 0ecbc1189, 15,389 corrected originals, 455 pending findings and 17,846 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 85c8bcdf07 Translate Tamazight checklist add and remove activities
2026-09-14: Replace four Arabic activities preserving checklist versus item, addition/removal and To/From/In relationships. Preserve exact %s order/count and quotes. Full phrases and derived forms remain low confidence. All 17,846 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 9c3eee5091 Record minicard count translation repair
2026-09-14: Record ed9620896 and 17,842 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu aa3f4ce66a Align Tamazight minicard checklist count
2026-09-14: Align count terminology preserving literal (0/0) and explicit minicard scope. Small Card paraphrase and derived grammar remain low confidence for fluent review. All 17,842 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu f72dd937ac Record checklist count translation repair
2026-09-14: Record edd3ae666 and 17,841 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 8c1b29f291 Align Tamazight checklist count terminology
2026-09-14: Use native count and plural element components, preserving literal (0/0). Proposed checklist noun and complete phrase remain low confidence for fluent review. All 17,841 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu c8c5910514 Record checklist rule translation repairs
2026-09-14: Record 0379f9df8 and 17,840 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 177aff81b5 Translate Tamazight checklist rule actions
2026-09-14: Replace three French rule actions preserving Add versus Remove of whole checklist. Proposed checklist term remains low confidence for fluent review. All 17,840 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 6e7eda9828 Record checklist noun translation repairs
2026-09-14: Record 3cd6ae3d6 and 17,837 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu e50b2b72f7 Translate Tamazight checklist noun labels
2026-09-14: Replace six Arabic/French labels preserving singular, plural and Of relation with native list components. Proposed verification noun and full checklist terminology remain low confidence for fluent review. All 17,837 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 35870c7afd Record checklist confirmation translation repairs
2026-09-14: Record b0a3b5308, 15,387 corrected original findings, 457 pending findings and 17,831 correction records in Audit, TODO Later and Upcoming. Preserve full validation scope and confidence limits. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 59845f1cac Translate Tamazight checklist deletion confirmations
2026-09-14: Replace French confirmation questions preserving whole-checklist versus one-item deletion. Native Mastodon supplies question frame and bound singular item. Full checklist wording remains low confidence. All 17,831 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 6dc5481337 Record checklist menu translation repairs
2026-09-14: Record 0dd39bb6b and 17,829 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu efc33e5c10 Translate Tamazight checklist menu actions
2026-09-14: Replace Arabic Add Checklist and French Checklist Actions preserving whole checklist and plural actions. Proposed checklist noun and full grammar remain low confidence. All 17,829 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu d7f6c0f5d6 Record checklist deletion translation repairs
2026-09-14: Record 79be9d37d, 15,385 corrected originals, 459 pending findings and 17,827 correction records in Audit, TODO Later and Upcoming. Preserve native-source limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu a5aea16510 Translate Tamazight checklist deletion headings
2026-09-14: Replace French headings preserving single-item versus whole-checklist deletion and questions. Verification noun and full checklist paraphrase remain low confidence; targeted source review does not attest that noun. All 17,827 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 7ee844d5bb Record checklist action translation repairs
2026-09-14: Record 6435ad6a6, 15,384 corrected originals, 460 pending findings and 17,825 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu d70a159999 Translate Tamazight checklist item actions
2026-09-14: Replace wrong-language Add Item and Hide All Checklist Items, preserving distinct actions and scope. Proposed checklist paraphrase and derived morphology remain low confidence for fluent review. All 17,825 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu edb8e491e1 Record migration status translation repairs
2026-09-14: Record 1824cd778 and 17,823 correction records in Audit, TODO Later and Upcoming. Preserve remaining validation scope and confidence limits. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu f2603e2e74 Align Tamazight migration status terminology
2026-09-14: Align two migration status labels with reviewed native migration spelling, preserving status rather than progress/completion. Full noun chain remains low confidence for fluent review. All 17,823 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 8c074f2634 Record migration authorization translation repair
2026-09-14: Record 5bb209c06, 15,382 corrected original findings, 462 pending findings and 17,821 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu f0795037b3 Translate Tamazight migration administrator restriction
2026-09-14: Replace French restriction preserving only board administrators and ability to execute plural migrations. Derived grammar and full authorization sentence remain low confidence for fluent review. All 17,821 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 6de23d08e6 Record migration errors translation repair
2026-09-14: Record 66c8bd979 and 17,820 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu febec4e317 Translate Tamazight migration errors heading
2026-09-14: Replace French Migration Errors preserving plural errors distinct from warnings. Full software phrase remains low confidence for fluent review. All 17,820 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu c8ae38d24d Record plural migration translation repairs
2026-09-14: Record 41d712523 and 17,819 verified correction records in Audit, TODO Later and Upcoming. Preserve remaining validation scope and confidence limits. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 94a68db592 Align Tamazight plural migration and step labels
2026-09-14: Replace French All Migrations and align Migrations and Migration Steps with reviewed native components. Preserve plural and all semantics. Derived migration plural and full software phrases remain low confidence for fluent review. All 17,819 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 33e7c80a06 Record administrator translation repair progress
2026-09-14: Record 443b180a2 and 17,816 verified correction records in the translation audit, TODO Later and Upcoming. Preserve remaining validation scope and confidence limits. All three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu ba8efb2460 Use native Tamazight administrator role labels
2026-09-14: Replace Arabic administrator labels and align the singular board administrator role with native MediaWiki administrator terminology. Board-qualified phrase remains low confidence for fluent review. All 17,816 correction checks pass, preserving placeholders and newer translations.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 5baf01a119 Record Tamazight migration warning repair progress
2026-09-14: Update audit, TODO Later and Upcoming with c303eb013, 15,381 corrected originals, 463 pending findings and 17,813 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 839088b604 Translate Tamazight migration warnings heading
2026-09-14: Replace French Migration Warnings preserving plural warnings rather than errors or failure. Derived plural and full software-migration phrase remain low confidence for fluent review. All 17,813 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 4989bf15a4 Record Tamazight migration validation repair progress
2026-09-14: Update audit, TODO Later and Upcoming with 3416af191 and 17,812 correction records. Original counts are unchanged; retain full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu eb0c8fdc06 Translate Tamazight migration validation action
2026-09-14: Replace French Validate Migration with native verification imperative, preserving validation rather than running or completion. Verification-to-migration adaptation and complete action remain low confidence for fluent review. All 17,812 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 744c94df6e Record Tamazight step label repair progress
2026-09-14: Update audit, TODO Later and Upcoming with b84a88696 and 17,811 correction records. Original counts are unchanged; retain full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu d8a33d5fcb Translate Tamazight step and current-step labels
2026-09-14: Replace three French step labels preserving singular/plural and Current qualifier. Primary native references corroborate step noun and plural; extension to software phases and full agreement remain low confidence for fluent review. All 17,811 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu ef082a6f63 Record Tamazight migration control repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with 858a00526, 15,380 corrected originals, 464 pending findings and 17,808 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu a2546a352e Translate Tamazight migration run and progress controls
2026-09-14: Replace three French controls/statuses preserving imperative Run, ongoing Running/In Progress, ellipsis and board scope. Passive derivation, software-run terminology and complete phrases remain low confidence for fluent review. All 17,808 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 2ee3028cd6 Record Tamazight completion status repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with 1f72241e3, 15,379 corrected originals, 465 pending findings and 17,805 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 2bdb12f24f Translate Tamazight completion status labels
2026-09-14: Replace four French completion statuses while distinguishing bare completion from successful migration completion. Completed-tense adaptation, standalone grammar and full success phrase remain low confidence for fluent review. Generic Complete action remains under contextual review. All 17,805 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 0e091969f9 Record Tamazight selection and migration necessity repairs
2026-09-14: Update the audit, TODO Later and Upcoming with 94eb1a0c5, 15,378 corrected originals, 466 pending findings and 17,801 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 07e02fe2d6 Translate Tamazight selection and required migration labels
2026-09-14: Replace five French/Arabic labels with native selection and necessity components, preserving entity scope and required/not-required polarity. Full necessity constructions and software-migration wording remain low confidence for fluent review. Select Color follows native MediaWiki wording. All 17,801 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu a3324b43ce Record Tamazight migration label repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with 81fba99d7, 15,376 corrected originals, 468 pending findings and 17,796 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 54febc0b57 Translate Tamazight migration scope and failure labels
2026-09-14: Replace four French migration labels while preserving singular/plural, board/database scope and failed status. Native move noun adapted to software migration, derived plurals and full phrases remain low confidence for fluent review. All 17,796 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu cfed19e3f1 Record Tamazight field control repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with eb3965660, 15,375 corrected originals, 469 pending findings and 17,792 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu e5ae1e646c Translate Tamazight field control labels
2026-09-14: Replace French checkbox, dropdown list and custom-field filter labels with Tamazight components. Preserve selection, dropdown direction and filtering qualifiers. Full control terminology, bound nouns and derived plurals remain low confidence for fluent review. All 17,792 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 7c2366ec84 Record Tamazight field label repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with 97c1c79fe, 15,374 corrected originals, 470 pending findings and 17,789 correction records. Preserve full validation scope and low-confidence wording. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 2e89b4d91a Translate Tamazight field labels and actions
2026-09-14: Replace four Arabic/French field labels, preserving custom, edit, absence and hierarchical subtask qualifiers. Derived plural, specified/custom adaptation and complete phrases remain low confidence for fluent review. All 17,789 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu dc8cf3d3ec Record Tamazight linked entity repair progress
2026-09-14: Update audit evidence, short progress, TODO Later and Upcoming with af33f6640 and 17,785 correction records. Original counts are unchanged; preserve full language-validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu d82e7ae07d Translate Tamazight linked entity labels
2026-09-14: Repair Linked Subtask, Linked Card and Linked Board labels using native linked/associated wording. Preserve hierarchy and entity distinctions. Full kanban phrases and participle agreement remain low confidence for fluent review. All 17,785 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu eb2520e46a Record Tamazight added activity repair progress
2026-09-14: Update audit evidence, short progress, TODO Later and Upcoming with b26d1ddc1, 15,373 corrected originals, 471 pending findings and 17,782 correction records. Preserve full language-validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 62bdf5ab93 Translate Tamazight added activity messages
2026-09-14: Replace two Arabic added-activity messages with local Tamazight past-action and destination wording. Preserve all percent placeholders and subtask hierarchy. Full activity grammar, past conjugation and kanban paraphrase remain low confidence for fluent review. All 17,782 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu d23ff15c53 Record Tamazight subtask action repairs
2026-09-14: Update audit evidence, short progress, TODO Later and Upcoming with repair 23c82a5c1, 15,372 corrected originals, 472 pending findings and 17,780 correction records. Preserve broader validation scope and remaining activity/linked-subtask review. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu ef0181cd4d Repair Tamazight subtask action wording
2026-09-14: Repair four subtask actions with explicit hierarchical task wording. Remove Language and With from Add Existing Card as Subtask, preserving Existing and As. Preserve confirmation question and plural Actions. Full paraphrases and morphology remain low confidence for fluent review. All 17,780 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu f26e1da7fa Record Tamazight hierarchical subtask repairs
2026-09-14: Update audit evidence, progress, TODO Later and Upcoming with f13775594, 15,371 corrected originals, 473 pending findings and 17,776 correction records. Retain full language-validation scope and open existing-card action. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 17f7bb4ac2 Translate Tamazight hierarchical subtask labels
2026-09-14: Replace five Arabic/French subtask labels with explicit Task(s) under a Task wording. Preserve hierarchy, singular/plural, settings and deletion question. Full paraphrases, bound noun morphology and kanban terminology remain low confidence for fluent review. Existing-card action repair remains open. All 17,776 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 8ab4387dcf Record Tamazight subtask review progress
2026-09-14: Keep the short audit, TODO Later and Upcoming updated with terminology finding 92f69f58d and its unresolved hierarchical wording. Translation values and counts are unchanged. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 4559d6bacb Record Tamazight subtask terminology error
2026-09-14: Identify the unflagged use of Language in Add Existing Card as Subtask. Record indexed primary references and distinguish Work/Task evidence from the still-unverified hierarchical subtask term. Preserve relation semantics during the upcoming repair. No values or counts changed.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 93de00395e Record Tamazight custom help repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with repair ef6318121, 15,368 corrected originals, 476 pending findings and 17,771 correction records. Preserve broader validation scope and low-confidence wording. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 9ffc165f50 Translate Tamazight custom help link label
2026-09-14: Replace French Custom Help Link URL wording with native link and help components. Preserve URL and the custom qualifier. Full noun-chain grammar, bound link noun and specified/custom adaptation remain low confidence for fluent review. All 17,771 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 3cb39092d3 Record Tamazight domain Users repair progress
2026-09-14: Record local repair 196edd0f8, 17,770 correction records and remaining full validation scope in the audit, TODO Later and Upcoming notes. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu b0379afb88 Repair Tamazight domain Users heading
2026-09-14: Replace cross-dialect imseqdacen with the directly attested Standard Moroccan plural inssmrsn for domain account users. Preserve users rather than board members or people. MediaWiki Kabyle confirms the old form and its zgh translations attest the replacement. All 17,770 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu a1711a1b65 Record Tamazight Board View translation repairs
2026-09-14: Update Upcoming release notes, TODO Later and the short audit with local repair commit 7a2d1caf4, 17,769 correction records and remaining validation scope. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu e5b85f2419 Translate Tamazight Board View labels
2026-09-14: Replace two Arabic Board View labels with generic view and singular board wording. The adapted full phrase and bound board noun remain low confidence for fluent Standard Moroccan Tamazight review. All 17,769 audited correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 3f676bf498 Record Tamazight New User translation repairs
2026-09-14: record source fb554131b and 17,767 correction records in the audit and upcoming changelog. Original pending count remains 477; full New User phrasing and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 9d571595eb Translate Tamazight New and New User labels
2026-09-14: replace two Arabic labels with native New adjective and singular account-user wording. Complete New User heading remains low confidence for fluent review. All 17,767 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 8e680de9f5 Record Tamazight search instruction translation repair
2026-09-14: record source 15481a394, 15,367 corrected originals, 477 pending findings and 17,765 correction records. Full search sentence and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu b4aa7cd794 Translate Tamazight search text and Enter instruction
2026-09-14: replace French instruction preserving writing search text and pressing Enter. Native components support the wording; key-press adaptation, relative clause and full sentence remain low confidence for fluent review. All 17,765 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 9476c5baf7 Record Tamazight successful unlock translation repair
2026-09-14: record source 4ba8d17d4, 15,366 corrected originals, 478 pending findings and 17,764 correction records. Full success/unblock grammar and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu e82fbbe1ad Translate Tamazight successful user unlock result
2026-09-14: replace French result while preserving success, singular user and removal of login blocking. Positive success construction, removal nominalization and full bound phrase remain low confidence for fluent review. All 17,764 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu ec5a1d1aeb Record Tamazight all locked user translation repairs
2026-09-14: record source d0791c6c4, 15,365 corrected originals, 479 pending findings and 17,763 correction records. Full unblock phrases, passive adaptation and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu eb44e6733a Translate Tamazight all locked user unlock messages
2026-09-14: replace two French confirmation/result messages preserving All Locked Users and question versus completed-result meaning. Full quantified unblock phrases and passive adaptation remain low confidence for fluent review. All 17,763 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 9fa868468d Record Tamazight account unlock translation repairs
2026-09-14: record source 2f4752ff4, 15,363 corrected originals, 481 pending findings and 17,761 correction records. Complete unblock terminology and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 1d3e91be75 Translate Tamazight account unlock actions
2026-09-14: replace three French click, confirmation and all-user unlock labels by expressing removal of login blocking. Preserve this-user versus all-users scope. Full unblock compounds and grammar remain low confidence for fluent review. All 17,761 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 4cce726a49 Record Tamazight board and card reference repairs
2026-09-14: record source 18f7fa766 and 17,758 correction records in the audit and upcoming changelog. Original pending count remains 483; board plural, full phrases and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 14c0e79c1c Translate Tamazight board and card reference labels
2026-09-14: replace four Arabic labels preserving All versus generic Boards and This Board/Card scope. Board plural morphology and full kanban phrases remain low confidence for fluent review. All 17,758 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu f1035c98f8 Record Tamazight card count translation repairs
2026-09-14: record source faa68bf87 and 17,754 correction records in the audit and upcoming changelog. Original pending count remains 483; full numeral phrases and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 53faea649c Translate Tamazight other card count labels
2026-09-14: replace mixed English/Arabic count prose, preserving exact __count__, And/Other and singular/plural Card meaning. Full numeral phrase and counted noun morphology remain low confidence for fluent review. All 17,754 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 56592ee4ef Record Tamazight subworkspace translation repairs
2026-09-14: record source 8dc2224c7, 15,361 corrected originals, 483 pending findings and 17,752 correction records. Update prior subworkspace review status while preserving the new compound and full-phrase confidence limits. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu f2e9cb1498 Translate Tamazight subworkspace add and name labels
2026-09-14: replace two French headings with an explicitly derived subworkspace compound, preserving Add versus Name and hierarchy. New compound, bound form, workspace extension and full phrases remain low confidence for fluent review; indexed prefix evidence does not directly attest the compound. All 17,752 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 2058c8cf5c Record Tamazight text profile and list label repairs
2026-09-14: record source 45650996e and 17,750 correction records in the audit and upcoming changelog. Original pending count remains 485; broader validation stays open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 8fd6e40514 Translate Tamazight text profile and list deletion labels
2026-09-14: replace three Arabic labels with native Text, Profile and Delete List wording supported by MediaWiki and Mastodon. Preserve singular list and question punctuation. All 17,750 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 9f04cb9ed4 Record Bambara calendar terminology review progress
2026-09-14: record direct CLDR evidence 5610dff52 and full calendar terminology limits in the audit and upcoming changelog. Counts remain 485 pending originals and 17,747 correction records. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 9a16d9f590 Document Bambara tabular calendar terminology limits
2026-09-14: directly review current CLDR Bambara date fields and missing localized calendar variant names. Era vocabulary does not establish reference-date Epoch; retain both tabular calendar findings pending full terminology review. No translation values or counts changed.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu ee7e57c12f Record Tamazight start spelling review progress
2026-09-14: record evidence 2219d5358 in the audit and upcoming changelog. Counts remain 485 pending originals and 17,747 correction records; direct PDF, full command and subworkspace review remain open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 045444b838 Document Tamazight start versus share spelling evidence
2026-09-14: expanded indexed conjugation excerpt distinguishes plain bdu Begin/Start from emphatic bdu Share/Divide. Record printed page 94 and direct PDF redirect limits; full command and subworkspace terminology remain under review. No locale values or counts changed. All 17,747 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu ff7b1fdfb7 Record Tamazight Planning Poker start translation repair
2026-09-14: record source f16fae64a, 15,359 corrected original findings, 485 pending findings and 17,747 correction records. Complete command, indexed-only evidence and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 1d48efb925 Translate Tamazight Planning Poker start heading
2026-09-14: replace French start heading, preserving the Planning Poker feature name and distinguishing the action from the Start date noun. Indexed conjugation evidence and full command remain low confidence: the manual currently redirects to HTML and needs direct/fluent review. All 17,747 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 6c9c536934 Record Tamazight workspace menu translation repair
2026-09-14: record source fea294be0, 15,358 corrected original findings, 486 pending findings and 17,746 correction records. Full workspace terminology and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 8db529010c Translate Tamazight workspace menu label
2026-09-14: replace French Workspace menu with native Menu and content-space components. Organizational workspace extension and complete bound phrase remain low confidence for fluent review. All 17,746 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu bf2f8bf10c Record Tamazight card heading translation repairs
2026-09-14: record source ad526816b and 17,745 correction records in the audit and upcoming changelog. Original pending count remains 487; full kanban phrases and broader translation validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 6a211b7fdd Translate Tamazight card type and popup headings
2026-09-14: replace four Arabic Card, Delete Card?, Card Actions and Labels headings, preserving ordinary card type, singular card and plural actions/labels. Full kanban terminology and bound phrases remain low confidence for fluent review. All 17,745 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 82ca5a02ba Record Tamazight search and rule translation repairs
2026-09-14: record source a06565956 and 17,741 correction records in the audit and upcoming changelog. Original pending count remains 487; morphology and broader translation validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu a5562c1208 Translate Tamazight search and rule nouns
2026-09-14: replace six Arabic user/member/list labels using reviewed native terminology. Preserve distinct singular object types; the derived free-state Member noun remains low confidence for morphology review. All 17,741 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 9af7d88d71 Record Tamazight date label translation repairs
2026-09-14: record source 82ba97005 and 17,735 correction records in the audit and upcoming changelog. Original pending count remains 487; broader translation validation stays open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 198add194c Translate Tamazight week month and year date labels
2026-09-14: replace three Arabic date predicate labels with exact CLDR native singular date-field names. Preserve date-unit meaning across tooltips, Gantt, calendar navigation and search. All 17,735 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 9013de7987 Record Tamazight profile and board view translation repairs
2026-09-14: record source aef5ea20a and 17,732 correction records in the audit and upcoming changelog. Original pending count remains 487; broader translation validation stays open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu cbd1047b95 Translate Tamazight profile and board view labels
2026-09-14: replace six Arabic People, Edit Profile, Title, Calendar, Lists and Members labels with native terminology supported by Mastodon, MediaWiki and CLDR. Preserve action, calendar and plural scope. All 17,732 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu c0e2e18191 Record Tamazight edit heading translation repairs
2026-09-14: record source e9f1b33b9 and 17,726 correction records in the audit and upcoming changelog. Original pending count remains 487; full phrase and broader translation review stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu d2d46ce5e4 Translate Tamazight team user and Planning Poker edit headings
2026-09-14: replace three French headings using native Edit terminology, preserving singular team/user objects and the Planning Poker name. Complete adapted phrases remain low confidence and need fluent review. All 17,726 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:10 +03:00
Lauri Ojansivu b80256cfdd Record Tamazight People translation repair
2026-09-14: update the audit and upcoming changelog with source cf0a2f19b and 17,723 correction records. Original pending findings remain 487; broader translation validation remains open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:10 +03:00
Lauri Ojansivu df6b3a1e7e Translate Tamazight People label
2026-09-14: replace the Arabic People label with the native equivalent documented in Mastodon zgh. Preserve generic people scope rather than users or board members. All 17,723 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 1a5242a1cf Record Tamazight Minguo calendar repair progress
2026-09-14: record source fix 67dbacc28 and update the audit and upcoming changelog to 15,357 corrected original findings, 487 pending findings, and 17,722 correction records. Full calendar naming and the remaining translation review stay open. Correction checks and all three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:10 +03:00
Lauri Ojansivu d791f67a87 Translate Tamazight Minguo calendar label
2026-09-14: Use the native Calendar noun and preserve the Minguo calendar name from English source, avoiding generic Chinese language/calendar substitution. LOW CONFIDENCE full mixed-script naming needs fluent review. All 17,722 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 9fa44a6b80 Record Tamazight authentication reference review progress
2026-09-14: Update short audit, TODO Later and Upcoming with directly verified authentication source provenance. Locale values and counts remain unchanged; three metadata test entries pass. Full terminology review continues.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 2a099f1e21 Verify Tamazight authentication reference provenance
2026-09-14: Direct dictionary extraction shows authentication terms marked MC£, whereas the search index renders MCF. The bibliography identifies Tuareg sources, so do not accept the candidate as Moroccan attestation. Preserve authentication, method/type, display and default scope; keep findings pending.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 037bac7f07 Record Tamazight title and details repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with two heading repairs and full-phrase review limits. All 17,721 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 329c1dd4df Translate Tamazight board title and card details headings
2026-09-14: Replace two Arabic headings, preserving singular Board Title and plural Details of a singular Card. Native title/details vocabulary is supported; LOW CONFIDENCE complete kanban phrases and bound forms require fluent review. All 17,721 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu cc2587f516 Record Tamazight server and status translation progress
2026-09-14: Update short audit, TODO Later and Upcoming with two software-label repairs and server-heading review limits. All 17,719 correction/rendering checks and three metadata test entries pass; 488 originals and broader validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 989b9c960b Translate Tamazight server error and closed status labels
2026-09-14: Replace two Arabic software labels, preserving Server Error heading and Closed status rather than Close action. Native components support the error heading; LOW CONFIDENCE complete server phrase requires fluent review. All 17,719 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 3802afd8e5 Record Tamazight member settings repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with three member/board label repairs and remaining full-phrase uncertainty. All 17,717 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 5f67771928 Translate Tamazight member and board settings labels
2026-09-14: Replace three Arabic labels, preserving singular Member Settings, singular Board Settings and plural Edit members. Native component terminology is supported; LOW CONFIDENCE complete kanban phrases and bound forms require fluent review. All 17,717 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 0414b9c985 Record Tamazight add label repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with six Add repairs and full-phrase review limits. All 17,714 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu ea0dc67775 Translate Tamazight board card list and member add labels
2026-09-14: Replace six Arabic Add labels and matching popup headings. Preserve distinct objects, singular board/card/list and plural members. Native references support components; LOW CONFIDENCE full kanban commands remain subject to fluent review. All 17,714 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu c33059e3d1 Record Tamazight duration unit repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with minutes/seconds repairs and remaining seconds-plural uncertainty. All 17,708 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 7ee8c65e19 Translate Tamazight minutes and seconds duration labels
2026-09-14: Replace two Arabic duration units, retaining minutes versus seconds and plural scope. Native software reference supports plural minutes; LOW CONFIDENCE derived seconds plural needs fluent morphology review. All 17,708 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 55fb4b7ece Record Tamazight weekday and duration repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with five reference-supported date/time labels. All 17,706 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 0e2a70634e Translate Tamazight weekday and duration labels
2026-09-14: Replace five Arabic labels using full native CLDR weekday names and reference-supported plural days/hours. Preserve weekday identity and duration plural scope. All 17,706 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 3c9d52f1a5 Record Tamazight navigation translation repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with five unflagged interface repairs. All 17,701 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu aa36776a96 Translate Tamazight navigation confirmation and settings labels
2026-09-14: Replace five Arabic interface labels with native software wording. Preserve Back versus previous-page adjacency, next versus previous, confirmation acknowledgment and generic Settings scope. All 17,701 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 0ba64ecd9f Record Tamazight invitation decline repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with the source-checked invitation rejection action. All 17,696 correction/rendering checks and three metadata test entries pass; 488 originals and wider language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 785db327d7 Translate Tamazight invitation decline action
2026-09-14: Replace the French Decline invitation button using the native request-rejection imperative. Source handlers confirm rejection rather than closing the popup. All 17,696 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 2dde68e7b9 Record Tamazight workspace deletion translation progress
2026-09-14: Update short audit, TODO Later and Upcoming with two deletion repairs and full-phrase review limits. Record 15,356 originals corrected, 488 pending and 17,695 correction records. Correction/rendering and three metadata test entries pass; wider language validation remains open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 5cde6f4a30 Translate Tamazight workspace confirmation and board deletion
2026-09-14: Replace the French workspace deletion question and Delete Board action. Preserve certainty, singular this-workspace object and deletion rather than archive. LOW CONFIDENCE complete workspace question and kanban board phrase require fluent review. All 17,695 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 3c57ed631e Record Tamazight workspace settings repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with three repairs and remaining full-heading uncertainty. Record 15,355 originals corrected, 489 pending and 17,693 correction records. Correction/rendering and three metadata test entries pass; broader language validation remains open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 059d46d0a3 Translate Tamazight workspace settings and close labels
2026-09-14: Replace two French Workspace Settings headings and the Arabic Close action. Native software references support settings and close; LOW CONFIDENCE full workspace headings and bound-state terminology remain subject to fluent review. All 17,693 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 9f0b8ac23e Record Tamazight workspace translation repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with five workspace corrections and remaining terminology uncertainty. Record 15,353 originals corrected, 491 pending and 17,690 correction records. Correction/rendering and three metadata test entries pass; wider language validation remains open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 870da4dd27 Translate Tamazight workspace add edit and name labels
2026-09-14: Replace five French workspace values, retaining add versus edit and singular workspace-name scope. Native institutional usage corroborates the existing space noun. LOW CONFIDENCE WeKan workspace extension, bound form and full labels require fluent review; subworkspace remains separate. All 17,690 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 65fd342d9e Record Tamazight confirmation repair progress
2026-09-14: Update the short audit, TODO Later and Upcoming with the native software confirmation button repair. All 17,685 correction/rendering checks and three metadata test entries pass; 496 originals and wider validation remain open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 5f37a017d4 Translate Tamazight confirmation button
2026-09-14: Replace the Arabic Confirm label with the native software confirmation-button wording. Keep acknowledgment distinct from invitation acceptance and confirmation questions. All 17,685 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 1ba91f3e70 Record Tamazight page terminology repair progress
2026-09-14: Update the short translation audit, TODO Later and Upcoming with the source-supported singular page label. All 17,684 correction/rendering checks and three metadata test entries pass; 496 originals and wider language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 851bef0f13 Align Tamazight page label with native software terminology
2026-09-14: Use the exact native MediaWiki singular Page noun, retaining scope and avoiding claims about other regional synonyms or full page phrases. All 17,684 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu b19df31eac Record Tamazight Amete Alem calendar repair progress
2026-09-14: Update audit summary, TODO Later and Upcoming with the native Ethiopic base repair and retained era distinction. Record 15,348 originals corrected, 496 pending and 17,683 correction records. Correction/rendering and three metadata test entries pass; complete language validation remains open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 794c8acdac Translate Tamazight Ethiopic Amete Alem calendar label
2026-09-14: Use the CLDR native Ethiopic calendar base while preserving the Amete Alem era variant name. LOW CONFIDENCE composed mixed-script label remains subject to fluent review. All 17,683 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu a23812c6a3 Record Tamazight email invitation repair progress
2026-09-14: Update the short audit, TODO Later and Upcoming with the email-invitation correction and its remaining dialect uncertainty. All 17,682 correction/rendering checks and three metadata test entries pass; the original pending queue remains 497.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu c2fb2749b1 Translate Tamazight email invitation action
2026-09-14: Replace the remaining French email-invitation button using the existing Invite action and native email term, preserving the email channel. LOW CONFIDENCE invitation verb and full instrumental phrase; renewed Moroccan dialect review remains required following the CNAM provenance correction. All 17,682 correction and rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 4baaca8844 Record Silesian terminology review progress
2026-09-14: Update the short translation audit, TODO Later and Upcoming with the reference follow-up. Preserve all 497 pending originals and the wider validation scope. Three changelog and audit-progress test entries pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 454dd4291e Document Silesian database terminology evidence
2026-09-14: Corroborate regional human computer-database usage and distinguish it from the Polish article wrapper. Keep the raw-file qualifier and complete label pending; record retrieval limits without treating missing evidence as a language error.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu dfcdb6530b Record Tamazight cron severity translation progress
Update dated audit and Upcoming with unflagged repair and 17681 correction records. Explicitly retain terminology review in cron and recovery contexts. Three metadata test entries pass.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu fb65e027b4 Use Tamazight severity terminology in cron error table
Replace French with existing recovery severity wording for identical source. Terminology remains low confidence and needs fluent review in both contexts; local consistency is not linguistic validation. All 17681 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 908e4c3365 Record Tamazight minicard cover translation progress
Update dated audit and Upcoming with three repairs, 17680 correction records and 497 pending originals. Keep full phrase and wider language validation visible. Three metadata test entries pass.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 57685be530 Translate Tamazight minicard cover image controls
Preserve add, remove from and display on minicard cover distinctions. Local cover sense and full phrases remain low confidence pending fluent review. All 17680 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu f73c3209df Record Tamazight avatar upload translation progress
Update dated audit and Upcoming with two unflagged repairs, 17677 correction records and remaining language validation requirements. Three metadata test entries pass.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 88a9aeef4c Translate Tamazight avatar upload action and completion labels
Preserve imperative upload versus completed upload state using native action vocabulary and local profile-picture terminology. Passive morphology and full phrases remain low confidence pending fluent review. All 17677 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu aa9103128c Record Tamazight avatar popup translation progress
Update dated audit and Upcoming with three unflagged repairs, 17675 correction records and remaining language validation requirements. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu bcc1bd4e82 Translate Tamazight change and delete avatar popup titles
Replace three Arabic and French titles using local profile-picture vocabulary and native actions. Full profile terminology remains low confidence pending fluent review. All 17675 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu aaeb0763f2 Update Tamazight troubleshooting review status
Link dated terminology evidence in audit and Upcoming while keeping unresolved full instructions visible. Three metadata test entries pass; no locale values changed.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu fd1301db02 Record Tamazight server troubleshooting terminology review
Separate native server/error vocabulary from indexed cross-dialect execution and installation terms. Preserve command and installation scope requirements; no locale values or counts changed.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 896fa82923 Record Tamazight named calendar translation progress
Update dated audit and Upcoming with source repair, 17672 correction records and 500 pending originals. Keep full phrase and wider language validation visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu c5202dfd66 Complete Tamazight Dangi and ISO calendar labels
Use native calendar noun while preserving Dangi and exact ISO-8601 names. Full mixed-script composition remains low confidence pending fluent review. All 17672 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu d2afa814fe Record Tamazight Umm al Qura translation progress
Update dated audit and Upcoming with source repair, 17670 correction records and 501 pending originals. Retain provisional CLDR and wider language review requirements. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu f3534ffd4d Translate Tamazight Umm al Qura calendar label
Reuse provisional CLDR Islamic calendar wording and preserve the named Umm al-Qura variant. Complete composition remains low confidence pending fluent review. All 17670 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 7f19014973 Record Tamazight rule list name translation progress
Update dated audit and Upcoming with unflagged repair and 17669 correction records. Keep 502 pending originals and wider language validation visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu c333e96a8a Translate Tamazight rule list name label
Replace French with native name and list vocabulary. Complete kanban noun phrase remains low confidence pending fluent review. All 17669 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 4c622b41a5 Record Tamazight support not yet added translation progress
Update dated audit and Upcoming with source repair, 17668 correction records and 502 pending originals. Keep wider language validation requirements visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 278ca9967c Translate Tamazight support information not yet added notice
Retain support information, not yet and added action using native component vocabulary. Full negative passive phrase remains low confidence pending fluent review. All 17668 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 6c8234559c Record Tamazight account and card translation progress
Update dated audit and Upcoming with three unflagged repairs and 17667 verified correction records. Keep 503 pending originals and broader language validation visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu c6d225f644 Translate Tamazight account and card noun labels
Replace three Arabic labels while preserving plural accounts/cards and singular card distinctions. Derived account plural and technical card terminology remain low confidence pending fluent review. All 17667 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu fd6378c9c5 Record Tamazight CPU count translation repair progress
Update dated audit and Upcoming with repair commit, 17664 correction records and 503 pending originals. Keep broader language validation requirements visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu ffd0a02e24 Repair Tamazight OS CPU count translation
Replace Arabic CPU consumption wording with CPU count using native count vocabulary. Retain conventional OS and CPU abbreviations. Full mixed-script label remains low confidence pending fluent review. All 17664 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 842ca7d7b0 Record Tamazight end date search translation progress
Update dated audit and Upcoming with repair commit and 17663 correction records. Keep 504 pending originals and wider language validation visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu dc56a74b0f Translate Tamazight end date search predicate guidance
Retain exact predicate code and cards with an end date, without implying completed or overdue cards. Full relative construction remains low confidence pending fluent review. All 17663 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 7fd5289296 Record Tamazight card member translation progress
Update dated audit and Upcoming with repaired board/card scope, 17662 correction records and 505 pending originals. Wider language review remains open. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu e5e75d14e5 Translate Tamazight card member instruction and restore board scope
Preserve adding board members to the card or removing them from the card, without implying removal from the board. Full coordinated instruction remains low confidence pending fluent review. All 17662 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 3edda4b48b Record Tamazight cron message translation progress
Update dated audit and Upcoming with repair commit and 17661 correction checks. Keep 506 pending originals and wider fluent review visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 1faf5af987 Translate Tamazight cron error message label
Retain message versus error details distinction using native component vocabulary. Complete software noun phrase remains low confidence pending fluent review. All 17661 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 3588b781e9 Record Tamazight support access translation progress
Update dated audit and Upcoming with 17660 correction records, source commit and 506 pending originals. Retain full phrase and broader language review requirements. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu cff15734b1 Translate Tamazight support authenticated user notice
Preserve support information restricted to logged-in users only. Native components support provisional wording; derived participle and full sentence remain low confidence pending fluent review. All 17660 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 773473eb03 Record Tamazight support translation repair progress
Update dated audit and Upcoming with four unflagged repairs and 17659 verified correction records. Keep 507 pending original findings and broader language review requirements visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu cd635c2975 Translate Tamazight support page labels
Replace four Arabic and French support labels with native assistance vocabulary. Preserve title and content distinctions. Full noun phrase composition remains low confidence pending fluent review. All 17659 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu a034738555 Record Tamazight planning poker translation repair progress
Update 2026-09-14 audit and Upcoming with repair commit, 17655 correction checks and 507 pending original findings. Broader fluent review remains required. Three metadata test entries pass.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 464e8064ac Translate Tamazight planning poker delete and vote date titles
Preserve the named estimation technique, this deletion question and change vote end-date action. Full composition remains low confidence pending fluent review. All 17655 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu db9603259f Record Quechua sighting calendar translation progress
Update dated audit and Upcoming with repair commit and 509 pending original findings. Preserve astronomical epoch and broader language review requirements. Three metadata test entries pass.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 02fa748b88 Repair Quechua Saudi Hijri sighting calendar label
Use primary CLDR Quechua calendar and sighting vocabulary, retaining the omitted sighting distinction. Complete composition remains low confidence pending fluent review. Astronomical epoch terminology remains unresolved. All 17653 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu b149c1a4d6 Update Upcoming and translation audit voting repair progress
Record the 2026-09-14 voting repair commit, 17652 verified corrections and unchanged 510 original pending findings. Retain fluent review, restored-value and provenance review limitations. Three metadata test entries pass.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 9d8719dc1f Translate Tamazight card voting controls
Replace four Arabic and French voting labels with consistent Tamazight wording. Preserve question, edit and deletion actions. Election terminology adapted to card voting and complete phrases remain low confidence pending fluent review. All 17652 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 2c36eea6d5 Record Tamazight vote date translation progress
Update audit and upcoming changelog on 2026-09-14 with 510 pending originals. Preserve terminology confidence limits and record passing structural checks.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 5444fd2ff2 Translate Tamazight vote end date popup title
Replace French title on 2026-09-14 while preserving change-date action. Native components support provisional wording; mark election-to-card-voting and complete syntax as low confidence.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 9582fd0b81 Record Tamazight search guidance translation progress
Update audit and upcoming changelog on 2026-09-14 with 511 pending originals. Preserve indexed-source limitations, low-confidence guidance adaptation and broader provenance review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu e37cdd5645 Translate Tamazight search instructions heading
Replace French heading after native vocabulary review on 2026-09-14. Mark institutional directives to usage guidance adaptation as low confidence pending fluent review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 093e5eefde Document Tamazight memory terminology follow-up
Link 2026-09-14 independent usage review in upcoming release notes. Preserve uncertainty and unchanged original pending counts.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 0b608edc68 Review independent Tamazight memory usage evidence
Record direct Moroccan RAM terminology usage on 2026-09-14 for three memory records. Preserve low-confidence flags because website translation provenance and full diagnostics grammar remain unverified. No locale values changed.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu d55d3a60c0 Document corrected translation reference provenance
Record dated 2026-09-14 attribution correction and renewed terminology review in upcoming release notes and TODO Later. Preserve unchanged pending counts and distinguish structural tests from fluency.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu c6ff27201e Correct Tamazight reference provenance assumptions
Review CNAM bibliography on 2026-09-14 and correct source notes in 98 translation records. MC£ denotes Tuareg sources and MC denotes Mokrane Chemim, not Central Moroccan dialect codes. Retain affected terminology for renewed review without altering locale values.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu afb1f9fb34 Record Tamazight due today translation progress
Update audit and upcoming changelog on 2026-09-14. Record 512 pending originals, passing checks and remaining deadline terminology review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu e7e5ef563e Translate Tamazight due today status
Replace French wording on 2026-09-14 while preserving current qualifier and date placeholder. Record deadline terminology and full status syntax as low confidence pending review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu a97a044b0d Record Ewe sighting calendar repair progress
Update audit and upcoming release notes on 2026-09-14 with 513 pending originals. Record restored sighting qualifier, passing structural checks and remaining full-language validation.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu d73bc647f8 Translate Ewe Saudi sighting calendar label
Restore the omitted sighting qualifier and native calendar wording on 2026-09-14. Preserve country identity and mark moon-sighting composition as low confidence pending fluent review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu a03d3e2e70 Document Dzongkha variant reference review
Link dated 2026-09-14 dictionary review in upcoming release notes. Keep unresolved Hijri variants and wider translation validation scope explicit.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 34e1e16d2e Review Dzongkha calendar variant reference limits
Compare directly downloaded publisher and GNU dictionary copies on 2026-09-14. Corroborate Coptic spelling and retain Hijri variants pending legible tabular, epoch and sighting terminology. Record extraction conflicts without treating indexed text as complete validation.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu a74567181e Record Dzongkha calendar translation progress
Update audit and upcoming changelog on 2026-09-14 with 514 pending originals. Record dictionary evidence, extraction limitation, passing checks and remaining fluent review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 3b9b9e677c Translate Dzongkha Coptic calendar label
Replace English-only label using Dzongkha computing dictionary vocabulary on 2026-09-14. Preserve Coptic identity and record full compound spelling as low confidence pending language review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 5ad0aa8405 Record Tamazight announcement translation progress
Update audit and upcoming changelog on 2026-09-14. Record 515 pending originals, one additional unflagged repair, passing checks and remaining language validation.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 3e14cc9601 Translate Tamazight announcement labels
Replace Arabic and French labels using native announcement vocabulary on 2026-09-14. Keep full administrator attribution syntax low confidence and retain separate system-wide active finding for review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 9f976fba8c Record Tamazight external memory translation review
Update audit and upcoming release notes on 2026-09-14. Record 516 pending originals and unresolved free-memory terminology, with passing structural checks.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu e203ace1de Translate Tamazight external memory diagnostic
Replace French Node memory usage label on 2026-09-14. Preserve external qualifier without implying external storage; mark full mixed-source adaptation low confidence.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 0a08fd51a3 Record Tamazight card creator translation progress
Update audit and upcoming changelog on 2026-09-14. Record 517 pending originals, verified structural checks and remaining language validation.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu fcb0580de6 Translate Tamazight card creator display setting
Replace French setting text after native vocabulary review on 2026-09-14. Preserve creator ownership and existing terminology, with complete card label adaptation marked low confidence.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 5e2de7e7c9 Record Tamazight total memory repair progress
Update audit summary and upcoming release notes on 2026-09-14. Record 518 pending originals, passing structural checks and remaining fluent language validation.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 636e1aef81 Translate Tamazight total memory diagnostic
Replace Arabic OS total-memory label on 2026-09-14 using native total vocabulary and Moroccan computing terminology. Preserve total versus free memory distinction and mark full adaptation low confidence.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 86833045dd Record Tamazight upload status repair progress
Update audit and upcoming release notes on 2026-09-14 with 519 pending original findings and explicit low-confidence grammar review. Correction and metadata tests pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 9ecbdf30da Translate Tamazight upload completion status
Replace French status text after native vocabulary review on 2026-09-14. Mark positive completion morphology and full status sentence as low confidence pending fluent review.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu a2e5a82cee Record Tamazight email imperative review
Update audit progress and upcoming changelog on 2026-09-14. Record the three refined email commands, passing correction checks, unchanged pending counts and remaining language review.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu dbb9d53098 Refine Tamazight email click commands
Use the native MediaWiki imperative in three email bodies after reference review on 2026-09-14. Preserve placeholders and keep complete email wording under low-confidence language review.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 46fa0e2637 Document Tamazight memory usage repair
Update translation audit progress and upcoming release notes on 2026-09-14. Record 520 remaining original findings and preserve the wider language validation scope.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 6e7ecf2eb2 Repair Tamazight memory usage label dated 2026-09-14
Replace French diagnostics label with native usage and documented computer-memory components. Full nominal adaptation remains low confidence. All 17,637 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu cc7dec1810 Record existing account translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repair and 521 pending originals. Custom-field and complete language review remain open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 746a10ff72 Repair Tamazight existing account prompt dated 2026-09-14
Replace French conditional prompt while preserving already-existing account. Native possession/conditional components support vocabulary; full clause remains low confidence. All 17,636 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 2e6b778f92 Record restore control repair dated 2026-09-14
Update audit, TODO Later and Upcoming with unflagged repair and remaining archive/imperative review. Original pending count remains 522. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 0e4ea74c7f Repair Tamazight restore control dated 2026-09-14
Replace unflagged Arabic Restore with native restoration-root command, recording imperative uncertainty. Archive-specific terminology remains unresolved. All 17,635 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 310def920b Record login error translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repair and 522 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 9fbd8467a1 Repair Tamazight login attempt error dated 2026-09-14
Replace French error message while preserving error during attempted login without inventing a password or LDAP cause. Record temporal-clause uncertainty. All 17,634 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 5be4c48fee Record board scan translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repairs and 523 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu fd8b479c16 Repair Tamazight board scan labels dated 2026-09-14
Replace French checking labels while preserving separate file-attachment and member-avatar scopes. Record derived action noun and complete ownership uncertainty. All 17,633 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 67e314ccf4 Record native Tamazight opening verb review dated 2026-09-14
Add primary IRCAM transitive and indexed imperative references, distinguishing spelling variation and failed full-document retrieval from verified software phrasing. Keep values and counts unchanged. Audit-progress regression passes.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 7ef2d46405 Record card opening translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repairs and 525 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 3856f63a3a Repair Tamazight card opening labels dated 2026-09-14
Replace Arabic open action and many-cards-at-once label. Preserve imperative, multiple cards and one-operation qualifier. Record verb and full-phrase uncertainty. All 17,631 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 78ff1f98cb Record Tamazight field sum review dated 2026-09-14
Keep numeric sum distinct from addition operation, count and financial amount. Record reference limitations and failed full-PDF fetch without changing translation values or counts. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 43dda3e66b Record file size translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked maximum-size repairs and 526 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 07f7ea683d Repair Tamazight file size limits dated 2026-09-14
Replace Arabic avatar and upload file-size labels, preserving maximum, byte units and distinct scopes. Record mathematical-term adaptation and composed noun uncertainty. All 17,629 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 1c1908ead2 Record username translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked minimum-length repair and 528 pending original findings. Full language validation remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 7791cbb31b Repair Tamazight username length warning dated 2026-09-14
Replace French warning while preserving required minimum of three characters and username scope. Record full-composition uncertainty. All 17,627 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 17d11135dd Record removal fragment repair dated 2026-09-14
Update audit, TODO Later and Upcoming with unflagged correction and remaining passive/assignee review. Original pending count remains 529. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 35121ef8b2 Repair Tamazight removal source fragment dated 2026-09-14
Replace French Removed from while preserving passive event and source relation. Record finite-passive uncertainty; assignee terminology remains distinct and unresolved. All 17,626 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu d5ce846e44 Record move rule translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repairs and 529 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 16ff43bf88 Repair Tamazight card move rule triggers dated 2026-09-14
Replace French move fragments while preserving another-list destination and when-event scope. Record derived passive and agreement uncertainty. All 17,625 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 318899a659 Record card activity translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked move/restore repairs and 530 pending findings. Keep full language validation open. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu c7d630200e Repair Tamazight card move and restore activities dated 2026-09-14
Replace French messages using native move/restore components. Preserve old and new board locations and restore destination, with every placeholder intact. Full phrasing remains low confidence. All 17,623 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu edbcc0e4b7 Record member removal translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked corrections and 532 pending original findings. Preserve broader fluent review scope. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 0e797a3aca Repair Tamazight member removal messages dated 2026-09-14
Replace French activity and Arabic removal control. Preserve member removal from card and all nested location placeholders. Native remove/member components are supported; complete activity wording remains low confidence. All 17,621 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu e857407c3d Record JSON warning translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repair and 533 pending original findings. Preserve full-language and clipboard terminology review scope. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 6a3b81124b Repair Tamazight JSON validity warning dated 2026-09-14
Replace French warning with native text and negative-validity components, retaining JSON format. Complete construction remains low confidence; paste prompts remain open because clipboard terminology was not established. All 17,619 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu e2c23e9e28 Record board avatar translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repair, 15,310 corrected originals and 534 pending. Language validation remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu e24b61f139 Repair Tamazight board avatar display label dated 2026-09-14
Replace French display label with native show/member components and existing avatar terminology. Preserve ownership by board members; full wording remains low confidence. All 17,618 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu b9afb0560d Record date translation repairs dated 2026-09-14
Update audit, TODO Later and Upcoming with five source-linked corrections and 535 pending original findings. Keep full language validation open. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 8ca3f1a4a2 Repair Tamazight date editing messages dated 2026-09-14
Replace five French or Arabic popup and activity messages. Preserve start, end and received dates and destination-date/card placeholder roles. Record full-phrase and actor morphology uncertainty. All 17,617 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu ba330e49f8 Record avatar URL translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with the repair source and 15,306 corrected originals, 538 pending findings. Preserve low-confidence review scope. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 7d86e7a562 Repair Tamazight avatar URL migration labels dated 2026-09-14
Replace two French repair labels using the documented correction verb, retaining URL and existing avatar terminology. Complete wording remains low confidence pending language review. All 17,612 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 68b91c7d2a Record Excel import translation progress dated 2026-09-14
Link the Tamazight popup repair and update audit, TODO Later and Upcoming counts to 15,304 corrected originals and 540 pending. Keep fluent review and restored-value validation open. Changelog and progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 7a77db4e92 Repair Tamazight Excel import popup dated 2026-09-14
Replace French popup title while retaining Excel CSV/TSV names. Record native entry imperative and cached import terminology evidence with import-specific wording still low confidence. All 17,610 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu f4326910b3 Record Fulah calendar terminology review dated 2026-09-14
Distinguish education-guide calendar and grid/table terms from unresolved technical epoch qualifiers. Retain existing values pending complete evidence and refresh Upcoming to cover attachment, maintenance and calendar repairs. Audit-progress and changelog checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu e4c19c6d76 Record Fulah sighting repair progress dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked Saudi sighting fix, provisional-source issues and unresolved epoch/fluency scope. Track 15,303 corrected originals and 541 pending findings. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 8e8198e26d Restore Fulah Saudi calendar moon-sighting qualifier
Replace English label with reference-supported Fulah components and retain moon-sighting distinction. Record provisional CLDR punctuation issue, reject Swedish homograph as evidence and retain full technical-language uncertainty. All 17,609 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu a25844ff5e Record Fulah CLDR calendar repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked native Adlam names, Latin transcription caveats and remaining Hijri variant scope. Track 15,302 corrected originals and 542 pending findings. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 1582958d23 Use Fulah Adlam CLDR names for Buddhist and Coptic calendars
Transcribe full native calendar names into the Latin ff translation instead of bare English adjectives. Record exact Adlam source and low-confidence cross-script/regional transcription caveats. Three Hijri variant findings remain pending. All 17,608 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 91b654bb63 Record provisional Bambara calendar wording dated 2026-09-14
Update short audit, TODO Later and Upcoming with explicit lack of canonical native attestation and remaining epoch/fluency scope. Track 15,300 corrected originals and 544 pending findings. Mechanical correction, changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 281bc41b76 Add provisional Bambara Buddhist and Coptic calendar names
Restore calendar noun in two bare English labels using existing Bambara construction and provisional borrowed/proper names. Explicitly record lack of canonical native attestation, low-confidence spelling and composition, and unresolved epoch variants. All 17,606 mechanical correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 62557dc24a Record provisional Tamazight duplicate-list repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked repairs and explicit unresolved technical-meaning/grammar caveats. Track 15,298 corrected originals and 546 pending findings. Mechanical checks do not prove fluency; wider validation remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu c288651baa Repair Tamazight duplicate and empty-list deletion labels
Replace four French findings. Preserve duplicate and empty qualifiers using provisional repeat-derived and contains-nothing wording. Avoid private/double lexical ambiguity; record unresolved technical term and grammar explicitly. All 17,604 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu ffbd7fc60f Record Tamazight URL action repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked URL scope repairs and full language-validation caveats. Track 15,294 corrected originals and 550 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 27d9f69f48 Repair Tamazight file and attachment URL correction actions
Replace two French findings, preserving all-file versus attachment URL scope and correction action. Record exact lexicon references and dialect, acronym and noun-relation caveats. All 17,600 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 3c98f44636 Record Tamazight migration label repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked missing-list/ID and file-URL repairs. Track 15,292 corrected originals and 552 pending findings. Preserve wider language-validation scope. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 37fdff2d2f Repair Tamazight missing-list and migration correction labels
Replace four French findings, preserving create/fix, missing lists/IDs and file-URL correction scope. Record native and dialect-specific references with derived negative-plural grammar caveats. All 17,598 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu d7f2fb7a80 Record Tamazight upload wording repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with three unflagged source-linked repairs. Keep original pending counts unchanged and retain full language-validation scope. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 62f68966a0 Repair Tamazight attached activity and upload export headers
Preserve both ordered %s tokens, attachment event meaning, upload direction and by-actor versus at-time headers. Record native roots with derived conjugation and dialect caveats. All 17,594 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 4707fc9fb9 Record Tamazight filesystem wording repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked count/filesystem fixes and low-confidence adaptation caveats. Track 15,288 corrected originals and 556 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 0d1adc6879 Repair Tamazight attachment count and filesystem move wording
Replace four French/Arabic messages. Preserve minicard count, singular/all/all-of-board attachment scope and filesystem destination. Record explicit lexicon references with dialect and grammar caveats. All 17,591 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 5751d017aa Record Tamazight attachment message repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with eight source-linked repairs and exact scope caveats. Track 15,284 corrected originals and 560 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu b150142b28 Repair Tamazight attachment activities and bulk-move messages
Replace eight French/mixed-language values. Preserve deleted action, exact %s, when fragment, personal ownership, all versus all-of-board scope and GridFS/S3 destinations. Record dialect and composition caveats. All 17,587 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu c32d4cdce6 Record Tamazight attachment repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked attachment repairs, nine unflagged fixes and explicit dialect caveats. Track 15,278 corrected originals and 566 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 1dc34b1a93 Repair Tamazight attachment labels and action popups
Replace twelve French/Arabic values, preserving singular/plural attachment, distinct actions and GridFS/S3 destinations. Reference explicit Kabyle mail-attachment terminology with dialect, transcription and software-composition caveats. All 17,579 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 5e07b6c8d5 Record Tamazight field visibility repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with field scope, low-confidence grammar and source-linked correction evidence. Track 15,275 corrected originals and 569 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 4dddf82cb2 Repair Tamazight field label and board-admin visibility wording
Preserve field-label/minicard scope and visible-only-to-board-admin restriction. Include the unflagged unclear visibility translation and record native components with low-confidence grammar caveats. All 17,567 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 192686d203 Record Tamazight title repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with current counts and source-linked title repairs. Preserve low-confidence and broader validation scope. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu d648d4e23f Repair Tamazight search, card import and received-date titles
Replace three French findings while preserving all-board scope, Trello import direction and received date distinct from other dates. Record native component references and low-confidence software composition. All 17,565 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu f94bae4479 Record Tamazight group display repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked evidence, native display/index distinction and low-confidence grammar caveats. Track 15,271 corrected originals and 573 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 36313cda33 Repair Tamazight added-group display labels
Preserve added qualifier, plural team/organization scope and displayed-below relation. Reference native addition and display components without confusing indexed with displayed. Record derived agreement and dialect caveats. All 17,562 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 4203b96bfa Record Tamazight board-group repair progress dated 2026-09-14
Update the short audit, TODO Later and Upcoming source-linked entry. Track 15,269 corrected originals and 575 pending findings, including 432 Tamazight. Preserve wider validation scope and low-confidence caveats. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu ec6e915947 Repair Tamazight board-group removal and creation guidance
Replace four French findings, preserving removal from a board and contact-administrator creation instructions. Record native component references and low-confidence conjugation, dialect and full-phrase caveats. Verify all 17,560 audited corrections, rendering and placeholder invariants.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu fd349e0d37 Record Tamazight deletion warning repairs dated 2026-09-14 2026-09-14 11:08:04 +03:00
Lauri Ojansivu 7a0afb3318 Repair Tamazight group deletion guards and irreversible warnings 2026-09-14 11:08:04 +03:00
Lauri Ojansivu c5be484d0b Record Tamazight team repair progress dated 2026-09-14 2026-09-14 11:08:04 +03:00
Lauri Ojansivu 36f198b383 Repair Tamazight team labels and organization name errors 2026-09-14 11:08:04 +03:00
Lauri Ojansivu ae8df560f5 Record Tamazight email template repair progress dated 2026-09-14 2026-09-14 11:08:04 +03:00
Lauri Ojansivu 97a8210e63 Repair Tamazight email test recipient and template labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 8c21b2792b Record Tamazight organization repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 3ae48d78d2 Repair Tamazight organization labels and missing-name error 2026-09-14 11:08:03 +03:00
Lauri Ojansivu c4863b52a8 Record Tamazight comment repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu b9f553d2ff Repair Tamazight comment search error and header wording 2026-09-14 11:08:03 +03:00
Lauri Ojansivu cb8a321392 Record Tamazight multi-selection repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 95c40e770b Repair Tamazight multi-selection label and member actions 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 77c01cbed3 Record Tamazight placement repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 081b2c8af9 Repair Tamazight card and swimlane placement labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 78972dbe30 Record Tamazight calendar navigation review dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 8e39144f60 Repair Tamazight previous and next month navigation labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 2e29c11a0e Record Tamazight diagnostic translation review dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu bc8ef464f8 Repair Tamazight selected and diagnostic details labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 1a5ab8b5a1 Record Tamazight card display repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu ac49f847d0 Repair Tamazight card sorting and display labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 4daac53264 Record Tamazight label repair progress dated 2026-09-14 2026-09-14 11:08:02 +03:00
Lauri Ojansivu ee1845167c Repair Tamazight label actions and minicard text visibility 2026-09-14 11:08:02 +03:00
Lauri Ojansivu ad963fc16b Record wekan22 build verification in Upcoming changelog 2026-09-14 11:08:02 +03:00
Lauri Ojansivu 8532f1d034 Record used-email and username translation progress
Update dated source commit, verified correction inventory and remaining findings in Audit, TODO Later and Upcoming. Preserve the open grammar, fluency and broader validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 16d4a73dee Translate Tamazight used-email warning and username import
Replace Arabic and French while preserving already-used email address versus username import roles. Predicate agreement, derived plural nouns and import imperative remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu cfdb01f83e Record selected-list translation repair progress
Update dated source commit, verified correction inventory and remaining findings in Audit, TODO Later and Upcoming. Keep uncertain spelling and grammar plus wider validation open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 93c55d1fc9 Translate Tamazight selected-list position labels
Replace French and preserve opposite left/right directions and selected-list scope. Native direction vocabulary is reference-supported; emphatic spelling, bound forms and full phrase agreement remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu d1456d3598 Record board invitation translation repair progress
Update dated source commit, correction inventory and remaining original findings in Audit, TODO Later and Upcoming. Retain the open fluency and broader validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 288a2e7e53 Translate Tamazight board invitation templates and code label
Replace French mail/push templates and Arabic invitation-code label. Preserve inviter, recipient, board membership, cooperation purpose, link, registration code and exact placeholders. Full constructions, dialect and software adaptations remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu b6e01982c1 Record registration invitation translation progress
Refresh dated source commit, exact correction inventory and remaining findings in Audit, TODO Later and Upcoming. Preserve the open full-language validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu fd6e6bcd7b Translate Tamazight registration invitation diagnostics
Replace French sending error and success messages. Preserve registration/account-creation purpose without claiming invitation acceptance. Derived nouns, bound forms, affirmative success and full purpose phrases remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 427efc578f Record invitation translation repair progress
Update dated source commit, exact correction inventory and remaining findings in Audit, TODO Later and Upcoming. Preserve the open dialect, fluency and wider validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 50a4def6a0 Translate Tamazight invitation email template labels
Replace Arabic invitation body/subject labels and Invite action. Preserve invitation versus reception or computer prompt. Dialect adaptation, imperative spelling and full label chains remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 6e6bd1a122 Record activity email label translation progress
Update dated source commit and exact correction inventory in Audit, TODO Later and Upcoming. Keep uncertain terminology and broader language validation open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu ccd2f80728 Translate Tamazight activity email template labels
Replace Arabic activity and template labels, restore the omitted notification meaning and preserve body versus subject. Activity terminology adaptation, bound forms and full label chains remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 0d889466b5 Record enrollment and verification translation progress
Update dated source commit, exact correction inventory and remaining findings in Audit, TODO Later and Upcoming. Keep uncertain phrases and broader language validation open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu bc98c07cc4 Translate Tamazight enrollment and verification email bodies
Replace French and preserve distinct service-use versus account-email verification purposes, paragraph layout and user/URL tokens. Service adaptation, nested purpose clauses, verify spelling and borrowed click remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu bfc57173fc Record account email repair progress and group Upcoming translations
Update dated source commit, correction inventory and remaining audit findings. Group the five Upcoming translation entries and refresh their overview. Preserve the open fluency and broader validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 3834d033da Translate Tamazight enrollment subject and password reset email
Replace French while preserving account ownership, password reset purpose, greeting, thanks, paragraphs and site/user/URL tokens. Recipient paraphrase, reset conjugation, borrowed click imperative and full mail composition remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu b1bf1f9d97 Record email translation repair progress
Update dated source commit, correction inventory and remaining findings in Audit, TODO Later and Upcoming. Keep uncertain grammar and broader validation open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu c55d70403a Translate Tamazight email sending diagnostics
Replace three French failure, attempt-error and SMTP success messages. Preserve negative versus affirmative result and user ownership. Derived sending noun, affirmative success predicate and full sentences remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 2077f32c7f Record lockout scope translation repair progress
Refresh dated Audit, TODO Later and Upcoming notes with the verified correction inventory and remaining findings. Keep full-language validation and uncertain phrasing open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 193b225205 Translate Tamazight lockout account scopes and multiple operators
Replace three French values. Preserve existing-account correct-username/wrong-password versus nonexistent-username cases and multiple-operator capability. Account predicates, agreement and full phrases remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 724b0d4ce7 Record Tamazight search explanation repair progress
Update the dated audit source commit and correction inventory, refresh TODO Later counts and add Upcoming search translation notes. Preserve the open full-language validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu eab3486e69 Repair Tamazight search OR and AND explanations
Replace French and correct the mistaken optional interpretation of OR. Preserve any versus all condition scopes, example names and operator tokens. Full logical phrases and return conjugations remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 3e878a9eaa Add post-v11.76 translation repairs to Upcoming
Create Upcoming notes for the rule report and popup source commit after the new release. Refresh TODO Later validation status while leaving published release notes unchanged.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 56b805a165 Record rule popup translation repair progress
Record the dated source commit and verified correction inventory in Audit, TODO Later and Upcoming. These three unflagged repairs leave the original pending count unchanged; wider language validation remains open.
2026-09-14 11:08:01 +03:00
Lauri Ojansivu 7e3e11edaf Repair Tamazight rule report and popup wording
Replace French report and details and correct rule terminology in import/export. Preserve singular report and plural rules and both transfer actions. Import imperative derivation and full software phrasing remain low confidence pending fluent review.
2026-09-14 11:08:01 +03:00
github-actions[bot] 25a6c30785 Bump versions for v11.76 2026-09-14 01:37:00 +00:00
Lauri Ojansivu 83821962e6 Prepare v11.76 release 2026-09-14 04:35:32 +03:00
Lauri Ojansivu 4daeff9669 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 04:35:22 +03:00
Lauri Ojansivu 75a3b67702 Record rule repair progress and correct release entry placement
Update dated translation audit counts, TODO Later and Upcoming notes. Move five post-release translation entries from v11.75 to Upcoming because that release does not contain their commits. Preserve their descriptions and keep language validation open.
2026-09-14 04:35:17 +03:00
Lauri Ojansivu 207af96963 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 04:35:05 +03:00
Lauri Ojansivu b0b3520cc1 Repair Tamazight rule labels and action terminology
Replace French and Arabic values and distinguish the IRCAM rule noun from regular. Preserve singular and plural roles, board ownership and rule-title input. Software adaptation and complete phrases remain low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 3a5ddd1c87 Record custom HTML translation repair progress
Update the dated source commit, verified correction inventory and remaining findings in Audit, TODO Later and Upcoming notes. Preserve the open language-validation scope.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 4901ec2980 Translate Tamazight custom HTML insertion actions
Replace French while preserving opening and closing body tags and opposite insertion directions. Custom qualifier adaptation and full phrase composition remain low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 4b661a5bd0 Record start and end translation repair progress
Update dated source commit and exact correction inventory in the audit, TODO Later status and Upcoming notes. Keep uncertain phrasing and wider validation explicitly open.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 9143606500 Translate Tamazight start and end time messages
Replace seven French and Arabic labels and activity fragments using native start and expiration components. Preserve old versus new time placeholders. Generic calendar adaptation and full activity composition remain low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu ed0b853623 Update translation audit after received-time repairs
Record the dated source commit, verified correction inventory and remaining original findings. Refresh the TODO Later status and Upcoming translation notes while retaining the open fluency and wider validation scope.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 44c26d4c9c Translate Tamazight received-time activities
Replace French in both received-time activity fragments. Preserve current and previous time placeholders and destination direction. Reception terminology from the mixed-source computing lexicon and full phrase composition are low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu a6f136a8df Document successful rebuild of the wekan22 failure
Identify the saved v11.75 missing-Moment error as already repaired. Record the fresh Linux arm64 Meteor bundle build and passing assignee, calendar and release-preflight regressions in Upcoming notes. Keep translation audit progress unchanged during build verification.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 2f572cf139 Record Tamazight operator diagnostic repair progress 2026-09-14 04:35:00 +03:00
Lauri Ojansivu e40b678fd9 Repair Tamazight operator and expected-number diagnostics
Preserve operator classification and required versus received value, retaining format tokens exactly. Mathematical terminology adaptation, derived forms and full diagnostic phrasing remain low confidence pending review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 8c7b177128 Record Tamazight visibility and sorting translation progress 2026-09-14 04:35:00 +03:00
Lauri Ojansivu 105e51ebf3 Translate Tamazight visibility and descending-sort search help
Preserve public/private board scope and literal descending-sort prefix. Moroccan references support visibility terms; complete phrases and prefix composition remain low confidence pending review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu ab5b085052 Record Tamazight status and validation translation progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 85d88589f4 Repair Tamazight status help and validation labels
Replace French and Arabic while preserving status choices, date versus time validation and exact format tokens. Derived forms and complete diagnostics remain low confidence pending review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu fd1e46de59 Record Tamazight comment and label search repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 50c35f1fb0 Translate Tamazight comment and label search help
Preserve comment containment, color-or-name alternatives, expanded and abbreviated operator syntax. Derived terminology and full phrase composition remain low confidence pending review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 4bd5565b67 Record Tamazight scoped search translation progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 1c80a78ea4 Translate Tamazight creator label and scoped search instructions
Preserve member versus creator and board versus list title matching, retaining executable operator tokens. Complete relative clauses, plural and possessive agreement remain low confidence pending fluent review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 754713e406 Record Tamazight time and due-date repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 0f4d5adc3a Repair Tamazight time labels and due-date activity wording
Replace Arabic and French, distinguish now from today and preserve due-date destination/card placeholder order. Composed diagnostics, conjugation and inherited due-date terminology remain low confidence pending review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu dafa3a9a84 Record Tamazight ordering and export repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 1f3156f934 Repair Tamazight creation-date sorting and export messages
Replace French and mixed-script text while preserving sort direction, card versus board scope, export restrictions and literal format names. Complete noun and capability phrasing remains low confidence pending fluent review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 0d82edf247 Record account prompt translation repairs and color review limits 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 93c1fe9ef9 Translate Tamazight account creation and existing-account prompts
Preserve completed account creation, availability of sign-in and the existing-account question using native MediaWiki components. Complete capability and affirmative possession phrasing remains low confidence pending fluent review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 02d7f2439c Refresh upcoming release summary and translation audit totals 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 6d5c26c456 Record Tamazight Enter instruction repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu e07e742d2c Translate Tamazight Enter instructions for custom fields
Replace French options/items instructions, keeping Enter as the physical key and preserving action scopes. Complete keyboard phrasing and inherited item terminology remain low confidence. All 17,413 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu f4a69c3d92 Record Tamazight week and display repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 62daaf0331 Translate Tamazight week and All Boards display settings
Preserve ISO week-of-year, selectable first weekday and All Boards page display distinctions with native components. Full genitive and selection phrases remain low confidence. All 17,411 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 7ce014fb53 Record Tamazight sorting repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu e0b706b0ad Translate Tamazight sorting label and invalid-sort error
Replace Arabic/French using directly attested native sort terminology, preserving the format token and invalid-sort meaning. Full diagnostic composition remains low confidence. All 17,408 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu fe502f2151 Record Tamazight comment permission repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 07f665ef0b Translate Tamazight comment and read-only permissions
Repair Arabic/French role descriptions while preserving posting, comment visibility and read-only viewing/edit restrictions. Full capability conjugations and role composition remain low confidence. All 17,406 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 133c365262 Record Tamazight access requirement repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 1eca0d45b2 Translate Tamazight board access requirements
Replace French permission and board-role errors, retaining signed-in users, board membership and board administrator distinctions. Full conjugation and role/genitive composition remain low confidence. All 17,403 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 9218a4a9d2 Record Tamazight bulk-card sample repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu a72de52465 Translate Tamazight bulk-card JSON sample values
Replace French in six sample values while retaining JSON property names, three-card order and first/second/last identification. Full card genitives and derived feminine agreement remain low confidence. All 17,400 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu a142fbd341 Group upcoming translation repairs and refresh release overview 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 2ad42c8e63 Record Tamazight card-order repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu e8e35db559 Translate Tamazight top and bottom card-order commands
Repair six French labels with consistent first/last place wording, preserving add/move and own/selected list distinctions. Native components are reference-supported; full software phrases and possessive composition remain low confidence. All 17,399 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 0cf6c33882 Record Tamazight deletion and member repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 8682dbae5a Repair Tamazight deletion and board-member removal labels
Use native Tifinagh deletion wording, translate custom-field confirmation and member-removal activity, and preserve member/board placeholders. Full custom-field and activity composition remain low confidence. All 17,393 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu b49cce0dc7 Record Tamazight Subject and member repair progress 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 004796543a Repair Tamazight email subject and current-card members labels
Use a directly attested native Subject label and compose scoped current-card member wording. Full card/board composition remains low confidence. All 17,390 correction checks pass, including exact placeholder and newer-translation preference coverage.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 5453d352a7 Record Tamazight email permission repair progress
Update dated audit and Upcoming notes to 15,167 corrected originals and 677 pending findings. Retain full-phrase confidence limits and remaining validation scope.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu bfad1aa765 Translate Tamazight email-change permission
Replace Arabic using native MediaWiki permission, change and email components. Complete composition remains low confidence pending fluent review. Verify all 17,388 correction records, placeholders, rendering and newer-translation preference.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu b199c07565 Document upcoming build and release preflight fixes
Record successful Linux arm64 bundle compilation, regression coverage and remaining browser/platform verification limits. Document the read-only Upcoming notes check.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 6f6e78a9a0 Fix assignee bundle dependency and require upcoming release notes
Use existing native date formatting instead of the removed Moment dependency. Check real Upcoming entries before release tool installation or mutations, including explicit version overrides. Cover missing, empty and duplicate notes with read-only regression tests.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu dcccb718f3 Record mail-subject translation repairs and remaining language review 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 289231a7c6 Translate Tamazight password-reset and email-verification subjects
Replace French with native component wording and preserve the site-name placeholder. Full email phrasing, possessive attachment and verification verb dialect spelling remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 7e39fc89c1 Record dropdown translation repairs and selected-card color scope 2026-09-14 04:34:58 +03:00
Lauri Ojansivu f85bbbf5b5 Translate Tamazight dropdown choices and selection-color title
Replace French labels while keeping unknown distinct from none and selection color distinct from label creation. Complete phrases, derived noun forms and dropdown-option sense remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 5d0967f7db Record field-scope translation repairs and remaining review 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 614ba7687d Translate Tamazight field display and card-scope settings
Replace French field settings and the Arabic change-date popup title. Preserve new-card versus all-card scope. Full phrases, software-field usage and derived card forms remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 5a64686d7a Record field translation repairs and software terminology caveats 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 9639aabe34 Translate Tamazight create-edit and date-field labels
Replace Arabic and French with native create/edit/date vocabulary and IRCAM-attested field terminology. Keep button and popup creation wording consistent. Full software-field phrasing and bound date composition remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 149aa75c4b Record notification translation repairs and remaining language review 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 520b0d8f80 Repair Tamazight notification controls and unread-comment noun
Replace French notification labels and the incorrect image noun in the unread-comments tooltip. Preserve opposite read/unread states. Full command phrasing and inherited passive-read inflection remain low confidence despite reference-supported component vocabulary.
2026-09-14 04:34:58 +03:00
github-actions[bot] e556118a99 Bump versions for v11.75 2026-09-14 00:45:24 +00:00
Lauri Ojansivu 9c02d84414 Record member-removal and error terminology repair progress 2026-09-14 03:43:38 +03:00
Lauri Ojansivu 6e2824a6ed CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 03:43:37 +03:00
Lauri Ojansivu 8b34511fe8 Translate Tamazight member-removal and error-clearing labels
Replace four French values. Native sources attest remove, all, member and error components, including the error plural in the CNDH Amazigh memorandum. Full command phrasing, card compounds and software-error usage remain low confidence.
2026-09-14 03:43:10 +03:00
Lauri Ojansivu 9278de5931 Record member-selection and card-list translation repair progress 2026-09-14 03:41:09 +03:00
Lauri Ojansivu c60ea35b7d Translate Tamazight member selection and card-list controls
Replace three French labels while preserving import-member selection, full-card list display and per-list card counts. Native component vocabulary is reference-supported; complete phrases, derived bound forms and kanban card terminology remain low confidence.
2026-09-14 03:40:47 +03:00
Lauri Ojansivu 8ec1e97396 Record search-link translation repairs and current audit scope 2026-09-14 03:39:36 +03:00
Lauri Ojansivu 4f37e7278d Translate Tamazight search-link and board-renaming labels
Use native MediaWiki link, search and rename components. Full search-link demonstrative phrasing and board genitive wording remain low confidence and need fluent review. Preserve the search-link purpose and board target.
2026-09-14 03:39:08 +03:00
Lauri Ojansivu 650ceed585 Prepare v11.75 release 2026-09-14 03:38:56 +03:00
Lauri Ojansivu a6a7bb8d5a Update upcoming release summary and translation audit progress 2026-09-14 03:38:02 +03:00
Lauri Ojansivu 70784cac08 Record membership translation repairs and remaining scope 2026-09-14 03:35:08 +03:00
Lauri Ojansivu 4ca8e5d1b6 Translate Tamazight member and board-members labels
Use the native plural member noun while preserving board membership scope. The complete all-board-members compound and kanban board terminology remain low confidence for fluent review.

Thanks to xet7 !
2026-09-14 03:34:48 +03:00
Lauri Ojansivu e6a58ef63d CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 03:34:40 +03:00
Lauri Ojansivu f0b85220ea Document security-aware activity rendering and audit status 2026-09-14 03:34:39 +03:00
Lauri Ojansivu e5937d5314 Render activity values with the shared security-aware viewer
Apply Markdown, emojis and permitted HTML to card and sidebar activity values. Sanitize completed sentences and honor plain-link mode, retaining existing source URL guards and avoiding nested navigation anchors. Add positive, negative and browser regression coverage.

Thanks to xet7 !
2026-09-14 03:34:39 +03:00
Lauri Ojansivu a95bc74bff Record text-editing repair and checklist dialect review 2026-09-14 03:34:39 +03:00
Lauri Ojansivu 0b8895ab82 Repair Tamazight checklist text-editing label
Remove an extraneous first qualifier and use native edit/text components. Full as-text phrasing and bound spelling remain low confidence; candidate checklist control vocabulary is marked Kabyle and is not established as Moroccan usage.

Thanks to xet7 !
2026-09-14 03:34:39 +03:00
Lauri Ojansivu 3a2f8b041e Record description repairs in new upcoming release 2026-09-14 03:34:39 +03:00
Lauri Ojansivu 4dd56bc53a Translate Tamazight detailed-description and all-users choices
Replace French and Arabic using native component terms. Full description-with-more-details composition remains low confidence; all-users view usage also needs fluent review.

Thanks to xet7 !
2026-09-14 03:34:39 +03:00
Lauri Ojansivu 1a48f2bd90 Record weekly due-date translation repairs 2026-09-14 03:34:39 +03:00
github-actions[bot] 3e06727607 Bump versions for v11.74 2026-09-14 00:28:56 +00:00
Lauri Ojansivu 68241210c0 Prepare v11.74 release 2026-09-14 03:27:31 +03:00
Lauri Ojansivu 9c2d625d56 Translate Tamazight missing and weekly due-date filters
Preserve no-date and calendar-week scope using reference-supported components. Full deadline wording, next-week agreement and bound-state morphology remain low confidence for fluent review.

Thanks to xet7 !
2026-09-14 03:27:30 +03:00
Lauri Ojansivu 26fe8826c8 Added Meteor Skills.
Thanks to Meteor developers.
2026-09-14 03:26:52 +03:00
Lauri Ojansivu b06b76603e Record due-date translation repairs and remaining validation 2026-09-14 03:26:37 +03:00
Lauri Ojansivu 47796391ac Translate Tamazight due date and relative date filter labels
Use CLDR today/tomorrow terms and reference-supported date components. Complete due-date terminology adaptation remains low confidence for fluent review; preserve the distinction from completed cards.

Thanks to xet7 !
2026-09-14 03:26:19 +03:00
Lauri Ojansivu 02185026e4 Record avatar translation repairs and validation caveats 2026-09-14 03:25:06 +03:00
Lauri Ojansivu 66cba71ec4 Translate Tamazight avatar change and deletion confirmation
Replace Arabic and French with profile-picture controls. Native component terms and confirmation frame support the repairs; full compounds, bound state and demonstrative placement remain low confidence for fluent review.

Thanks to xet7 !
2026-09-14 03:24:47 +03:00
Lauri Ojansivu 51e8bfa693 Record filter and locked-user translation repairs 2026-09-14 03:23:46 +03:00
Lauri Ojansivu f25f84aded Translate Tamazight filter and empty locked-user status
Replace French while preserving cards-or-lists scope and the current-time qualifier. Native component terms support the repairs; composed phrases and kanban card morphology remain low confidence for fluent review.

Thanks to xet7 !
2026-09-14 03:23:27 +03:00
Lauri Ojansivu 1e9ecf1a28 Record title-filter translation repairs and remaining validation 2026-09-14 03:22:33 +03:00
Lauri Ojansivu 5ce0c18aad Translate Tamazight list and card title filter labels
Replace three French labels using native filter, title and list component terms. Preserve command and heading distinctions. Full title-filter phrases, card bound state and filter noun morphology remain low confidence for fluent review.

Thanks to xet7 !
2026-09-14 03:22:16 +03:00
Lauri Ojansivu 8cdb6d9748 Document membership-only global search in upcoming changelog 2026-09-14 03:21:34 +03:00
Lauri Ojansivu 4c59f03725 Restrict Search All Boards to active board memberships
Apply membership-only scope to search selectors and pagination while retaining public discovery for other callers. Add regression coverage for shared access and public boards.

Thanks to xet7 !
2026-09-14 03:21:22 +03:00
Lauri Ojansivu a92cac17fc Record minicard visibility translation repairs and remaining scope 2026-09-14 03:16:16 +03:00
Lauri Ojansivu c718b0ebea Translate Tamazight minicard list visibility controls 2026-09-14 03:16:01 +03:00
Lauri Ojansivu 7703c2069e Record description and minicard translation repairs 2026-09-14 03:15:27 +03:00
Lauri Ojansivu 506a188a2c Translate Tamazight description and minicard display controls 2026-09-14 03:15:11 +03:00
Lauri Ojansivu ab46d91882 Record minicard heading repairs and remaining language validation 2026-09-14 03:14:39 +03:00
Lauri Ojansivu 18bbe07e42 Translate matching Tamazight minicard settings headings 2026-09-14 03:14:25 +03:00
Lauri Ojansivu 8e586d9d71 Record settings label repairs and remaining audit validation 2026-09-14 03:13:41 +03:00
Lauri Ojansivu 9f0c7828b0 Translate Tamazight settings labels with native terminology 2026-09-14 03:13:27 +03:00
Lauri Ojansivu 8935b9b632 Record native morphology refinements and remaining validation 2026-09-14 03:12:58 +03:00
Lauri Ojansivu 81f4873050 Refine Tamazight blocked-user and confirmation morphology from native UI 2026-09-14 03:12:44 +03:00
Lauri Ojansivu 91956208fb Document movable Board View Settings and regression verification 2026-09-14 03:12:12 +03:00
Lauri Ojansivu 3b74d2c3c2 Keep Board View Settings visible and allow title drag and resize 2026-09-14 03:11:53 +03:00
Lauri Ojansivu 20e32a6598 Record loading repair provenance and remaining translation progress 2026-09-14 03:10:23 +03:00
Lauri Ojansivu fe590a6092 Pin the historical native loading reference accurately 2026-09-14 03:10:08 +03:00
Lauri Ojansivu 3d190b2868 Translate Tamazight loading and wait message from native UI wording 2026-09-14 03:09:49 +03:00
Lauri Ojansivu 0e6360c4d9 Record generic failure repair and remaining translation audit 2026-09-14 03:09:13 +03:00
Lauri Ojansivu 52c833e181 Translate Tamazight generic failure without adding a cause 2026-09-14 03:08:59 +03:00
Lauri Ojansivu 6858916e9c Record native credential-error repair and audit progress 2026-09-14 03:08:21 +03:00
Lauri Ojansivu 13dc65f612 Use native Tamazight invalid-credentials wording 2026-09-14 03:08:07 +03:00
Lauri Ojansivu 7ac515ccc8 Record Tamazight filter criteria repairs and validation caveats 2026-09-14 03:07:24 +03:00
Lauri Ojansivu 448d33abb0 Translate Tamazight date and label filter criteria 2026-09-14 03:07:11 +03:00
Lauri Ojansivu 977f06b565 Record Tamazight filter repairs and remaining translation scope 2026-09-14 03:06:42 +03:00
Lauri Ojansivu 883fcb85cd Translate Tamazight user display and clear-filter controls 2026-09-14 03:06:28 +03:00
Lauri Ojansivu fb1cc5666f Record deletion phrase repairs and remaining translation review 2026-09-14 03:05:58 +03:00
Lauri Ojansivu ad3a4f2dc7 Translate Tamazight comment confirmation and self-account deletion 2026-09-14 03:05:42 +03:00
Lauri Ojansivu 9bfd345e58 Record Tamazight deletion repairs and remaining validation 2026-09-14 03:05:09 +03:00
Lauri Ojansivu fef3c7e461 Repair Tamazight label removal and comment deletion text 2026-09-14 03:04:53 +03:00
Lauri Ojansivu 363966ad50 Update translation audit progress and lockout wording caveats 2026-09-14 03:04:17 +03:00
Lauri Ojansivu 8fc453f504 Repair Tamazight login-lockout status and user filter labels 2026-09-14 03:03:58 +03:00
Lauri Ojansivu f01e18ae43 Record Tamazight metadata repairs and remaining translation scope 2026-09-14 03:03:21 +03:00
Lauri Ojansivu fe2a8097e0 Repair Tamazight attachment export size and type labels 2026-09-14 03:03:08 +03:00
Lauri Ojansivu f8007230e9 Document regional language flags and RTL regression coverage 2026-09-14 03:02:22 +03:00
Lauri Ojansivu c8d17877e4 Place regional flags inside language labels and reverse RTL layout 2026-09-14 03:02:03 +03:00
Lauri Ojansivu 47a4b34303 Update translation audit after Tamazight activity repairs
Record dated source commit c6ee67cb1, four repaired original findings, filename refinement, 17313 correction records and 718 pending originals. Preserve explicit linguistic caveats and the full remaining validation scope. Audit and changelog checks pass.

Thanks to xet7 !
2026-09-14 02:56:56 +03:00
Lauri Ojansivu c6ee67cb11 Repair Tamazight label activity messages and refine filename wording
Replace four French add/remove-label activity messages with native tag and directional terminology, preserving label/card placeholder roles. Active addition inflection, default actor form and complete activity clauses remain low confidence pending fluent review. Refine the existing filename correction with directly attested upload-form wording and preserve its original before value. All 17313 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 02:56:29 +03:00
Lauri Ojansivu 0d4bda0857 Update audit progress after Tamazight label and lookup repairs
Record source commit 1d4ad977d dated 2026-09-14, six repairs including three unflagged values, 17309 correction records and 722 pending originals. Preserve full language-validation scope and explicit low-confidence terminology caveats. Audit and changelog checks pass.

Thanks to xet7 !
2026-09-14 02:54:58 +03:00
Lauri Ojansivu 1d4ad977d7 Repair Tamazight label text and lookup errors
Replace Arabic label/create-label/no-results text and French username/label/color lookup errors with native terminology and reference-supported clauses. Preserve all percent placeholders and distinguish missing username, named label and label color. Composed errors, create-label usage and color/tag morphology remain low confidence pending fluent review. All 17309 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 02:54:33 +03:00
Lauri Ojansivu 47951fd81a Update translation audit after Tamazight credential repairs
Record dated source commit e335ef034, 17303 correction records, 15119 resolved originals and 725 pending originals. Distinguish two unflagged label repairs and retain low-confidence credential composition and the broader validation scope. Correct the current largest-queue summary and update Upcoming.

Thanks to xet7 !
2026-09-14 02:52:41 +03:00
Lauri Ojansivu e335ef034a Repair Tamazight password confirmation and recovery messages
Replace French password confirmation and forgotten-password labels with native MediaWiki wording. Compose the username/password-required error from attested obligation and credential terms; the complete composition is low confidence pending fluent review. Preserve existing correct translations, key order and placeholders. All 17303 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 02:51:57 +03:00
Lauri Ojansivu 3589309a39 Record report viewer policies and avatar fallback verification
Update Upcoming and title rendering documentation with cumulative-flow and Control chart security policies. Record authenticated legacy avatar prefix fallback, passed focused checks, unrun live browser tests and the unresolved production attachment 404. Keep translation audit counts unchanged.

Thanks to xet7 !
2026-09-14 02:50:12 +03:00
Lauri Ojansivu ca8d599787 Cover Control chart titles under all viewer policies
Explicitly verify cumulative-flow and Control chart wrappers use the shared viewer. Add completed-card browser fixtures for Control chart and check report headings and card titles with formatted, plain-link and literal-source policies.

Thanks to xet7 !
2026-09-14 02:49:51 +03:00
Lauri Ojansivu 5ca16f32ed Apply shared title viewer to cumulative flow and report charts
Render chart headings and report table headers and cells through the shared security-aware viewer. Use rendered text and emoji for canvas labels and dataset titles, capturing them before afterFlush so policy changes remain reactive. Extend title adapter, chart context and cumulative-flow browser policy coverage.

Thanks to xet7 !
2026-09-14 02:48:52 +03:00
Lauri Ojansivu c2a3909281 Restore authenticated legacy avatars through prefix routes
The early universal file handler returned 404 for CollectionFS avatars before the legacy fallback handler could run, including versioned Meteor-Files URLs. Read legacy avatar metadata and streams only after authenticating the request, retain safe response headers, close conditional-request streams and preserve missing-file responses. Add positive and negative runtime coverage and a browser image regression.

Thanks to xet7 !
2026-09-14 02:48:27 +03:00
Lauri Ojansivu 02609d1c38 Document board title policies and regression coverage
Record shared viewer behavior for timeline and Gantt task titles, both Admin Panel plain-text policies, SVG label limitations and the remaining live browser verification.

Thanks to xet7 !
2026-09-14 02:46:54 +03:00
Lauri Ojansivu 457614a2ac Use security-aware title viewers in timeline and Gantt views
Render remaining board titles through the shared Markdown and emoji viewer, including DHTMLX task names. Escape rendered text in Frappe SVG labels and use formatted titles in chart popups. Observe settings when charts refresh. Import routing and date dependencies explicitly in the assignee view to prevent ReferenceErrors. Add runtime helper, compiler and browser regression coverage.

Thanks to xet7 !
2026-09-14 02:45:46 +03:00
Lauri Ojansivu 7f5e8d54d8 Record account translation repairs and current audit progress
Thanks to xet7 !
2026-09-14 02:39:39 +03:00
Lauri Ojansivu acafc79512 Repair Tamazight account creation command and user error
Use the native create-account command and compose the not-created user error from attested wording. Keep the complete error sentence explicitly low confidence pending fluent review.

Thanks to xet7 !
2026-09-14 02:39:16 +03:00
Lauri Ojansivu 1ed3cf629a Document Time view plain-link security behavior
Thanks to xet7 !
2026-09-14 02:38:43 +03:00
Lauri Ojansivu a7b333dad7 Cover Time view plain-link security setting in both modes
Verify the shared viewer passes the existing renderLinksAsPlainText setting to the sanitizer. Register browser tests retaining Markdown and emojis while changing link clickability; restore global settings after each test.

Thanks to xet7 !
2026-09-14 02:38:26 +03:00
Lauri Ojansivu 66aa0ef496 Record Tamazight account failure repair and remaining audit work
Thanks to xet7 !
2026-09-14 02:38:26 +03:00
Lauri Ojansivu b5db9509e4 Translate Tamazight account creation failure message
Use the native MediaWiki failed-account-creation clause without its upstream error-detail suffix, matching the WeKan source.

Thanks to xet7 !
2026-09-14 02:37:37 +03:00
Lauri Ojansivu 54314c287b Record Tamazight field-type repairs and remaining validation
Thanks to xet7 !
2026-09-14 02:37:02 +03:00
Lauri Ojansivu 9443ef3ae8 Repair Tamazight text and number field-type labels
Replace Arabic labels with native text and number terminology. Keep the numeric noun adaptation explicitly low confidence for fluent review.

Thanks to xet7 !
2026-09-14 02:36:40 +03:00
Lauri Ojansivu 29c9a31fb4 Document Time view viewer behavior and security setting coverage
Thanks to xet7 !
2026-09-14 02:36:00 +03:00
Lauri Ojansivu dc08557113 Render Time view card titles with the security-aware viewer
Reuse the shared Markdown and emoji viewer, including Admin Panel plain-text security mode. Keep overtime status outside user-authored Markdown. Add normal and plain-text browser regressions.

Thanks to xet7 !
2026-09-14 02:35:45 +03:00
Lauri Ojansivu c1e092b9e2 Record Tamazight calendar and export repair progress
Thanks to xet7 !
2026-09-14 02:34:31 +03:00
Lauri Ojansivu f0d42d57f1 Repair Tamazight Persian calendar and Excel export wording
Use the CLDR Persian language name and compose the Excel card-export command from attested terms, preserving the existing card noun. Record low confidence for the complete export phrase.

Thanks to xet7 !
2026-09-14 02:34:08 +03:00
Lauri Ojansivu 011e15c48c Update audit progress and caveats for Tamazight existence repairs
Thanks to xet7 !
2026-09-14 02:33:32 +03:00
Lauri Ojansivu f31ff3c1fc Repair Tamazight user existence messages
Compose native user-exists and user-does-not-exist labels from attested MediaWiki nouns and existence forms. Keep both full sentences explicitly low confidence pending fluent validation; preserve their opposite meanings.

Thanks to xet7 !
2026-09-14 02:33:14 +03:00
Lauri Ojansivu 3bc4cd3dd6 Record additional Tamazight translation repairs and verification
Thanks to xet7 !
2026-09-14 02:32:33 +03:00
Lauri Ojansivu ab785976f7 Repair Tamazight template file preview and watch labels
Replace thirteen French and Arabic interface values using matching native MediaWiki terminology. Preserve existing valid Tamazight alternatives and record exact before/after values.

Thanks to xet7 !
2026-09-14 02:32:14 +03:00
Lauri Ojansivu 05153a23fb Document calendar direction compatibility fix and validation
Thanks to xet7 !
2026-09-14 02:31:23 +03:00
Lauri Ojansivu ef12548a98 Use FullCalendar 5 direction option in board calendars
Replace the rejected legacy isRTL option in single-board and multi-board calendars. Verify both directions and absence of the old option; add browser coverage for rendered direction and console warnings.

Thanks to xet7 !
2026-09-14 02:31:05 +03:00
Lauri Ojansivu 306a077094 Update translation audit after Tamazight email repair
Record the dated translation commit, passing correction checks and 732 pending original findings. Preserve wider language-validation caveats.

Thanks to xet7 !
2026-09-14 02:30:11 +03:00
Lauri Ojansivu e56bc53e3e Translate Tamazight invalid email validation message
Replace the French label with the exact native MediaWiki invalid-email-address message. Existing correction regressions verify rendering, placeholders and preference for newer correct translations.

Thanks to xet7 !
2026-09-14 02:29:51 +03:00
Lauri Ojansivu 5dfaa4597f Record Silesian database terminology evidence and current audit count
Native MediaWiki messages attest shared database and file terminology. Keep the complete raw-file label pending until its remaining wording is validated. Correct the stale Tamazight TODO count to 590.

Thanks to xet7 !
2026-09-14 02:29:07 +03:00
Lauri Ojansivu 1e80beb4d5 Update translation audit after Greenlandic qualifier repair
Record 15,111 corrected originals, 733 pending and 17,277 correction records. Preserve unconfirmed reference and fluent-review caveats. Audit/changelog suites pass.
2026-09-14 02:25:52 +03:00
Lauri Ojansivu b373e07346 Repair Greenlandic Jalali Persian qualifier
Use CLDR Greenlandic persiskisut while preserving Jalali proper name. Record unconfirmed reference status and remaining fluent technical review. All 17,277 correction/rendering checks pass.
2026-09-14 02:25:26 +03:00
Lauri Ojansivu 4869be1059 Update audit with Manx calendar reference gaps
Record dated terminology review without changing repair counts. Three Manx originals and broader linguistic validation remain open. Correction and audit/changelog tests pass.
2026-09-14 02:24:38 +03:00
Lauri Ojansivu 669be88959 Record Manx calendar terminology reference gaps
Current CLDR supplies no calendar display names. Keep pending Coptic and full tabular/epoch terminology open, including fluent review of composed sighting wording. No values or counts changed. All correction checks pass.
2026-09-14 02:24:17 +03:00
Lauri Ojansivu 2161007ffe Update translation audit after Quechua crimson repair
Record dated repair, 17,276 correction records and twelve remaining palette wrappers. Preserve exact-hue/dialect caveats and unchanged 734 pending originals. Audit/changelog suites pass.
2026-09-14 02:23:35 +03:00
Lauri Ojansivu 114c5d9928 Repair Quechua crimson palette wording
Use dictionary-attested crimson adjective sani with native spelling sañi. Record polysemy and unresolved exact dialect/hue validation. Preserve distinct red/purple labels. All 17,276 correction/rendering checks pass.
2026-09-14 02:23:13 +03:00
Lauri Ojansivu b93a7ae273 Update translation audit after Quechua sky blue repair
Record dated repair, 17,275 correction records and thirteen remaining palette wrappers. Original pending count remains 734; broader linguistic validation stays open. Audit/changelog suites pass.
2026-09-14 02:22:41 +03:00
Lauri Ojansivu c149ce5160 Repair Quechua sky blue palette label
Use directly attested sky-blue adjective qhusi instead of English in unrelated message wrapper. Keep blue and pale-turquoise variants distinct. All 17,275 correction/rendering checks pass.
2026-09-14 02:22:18 +03:00
Lauri Ojansivu 3e593e5d6a Update translation audit after Quechua orange repair
Record dated repair, 17,274 corrections and remaining fourteen palette wrappers. Original pending count remains 734; broader validation remains open. Audit/changelog regressions pass.
2026-09-14 02:21:45 +03:00
Lauri Ojansivu f6dd287e0a Repair Quechua orange color label
Use directly attested orange-colored adjective killmu instead of English wrapped in unrelated message wording. Preserve distinction from yellow. All 17,274 correction/rendering checks pass.
2026-09-14 02:21:23 +03:00
Lauri Ojansivu 9664fdf81f Update translation audit with Tamazight calendar reference review
Record dated provisional naming and missing technical variant terms without changing counts or claiming completed repairs. Correction and audit/changelog checks pass.
2026-09-14 02:20:41 +03:00
Lauri Ojansivu dd2aaa19a6 Record provisional Tamazight Islamic calendar terminology
Review current CLDR calendar names and identify absent Buddhist and Hijri variant terminology. Keep existing values pending technical and fluent review; no translation values or counts changed. All 17,273 correction checks pass.
2026-09-14 02:20:22 +03:00
Lauri Ojansivu 8629f54c9b Record Tamazight upload repair and pending terminology review
Update dated audit with 17,273 correction records, unchanged 734 pending originals and unresolved email/import research. Audit and changelog suites pass; broader validation remains open.
2026-09-14 02:19:51 +03:00
Lauri Ojansivu 9dcd0aaa55 Repair French Tamazight upload label
Use native Upload file command distinct from Download. All 17,273 correction/rendering checks pass. Broader translation validation remains open.
2026-09-14 02:19:26 +03:00
Lauri Ojansivu 82a0164b01 Update audit after Tamazight user settings repair
Record dated repair and low-confidence heading review. Track 15,110 corrected originals, 734 pending and 17,272 correction records. Audit/changelog suites pass; broader validation stays open.
2026-09-14 02:18:38 +03:00
Lauri Ojansivu ee60f87d2c Repair French Tamazight user settings heading
Compose native preference and user terminology; retain explicit low-confidence grammar and UI terminology review. All 17,272 correction/rendering checks pass.
2026-09-14 02:18:17 +03:00
Lauri Ojansivu 2ff89485dd Update audit after Tamazight username label repair
Record dated repair, 15,109 corrected originals, 735 pending and 17,271 correction records. Preserve low-confidence composition caveats. Audit and changelog suites pass.
2026-09-14 02:17:44 +03:00
Lauri Ojansivu 5babc392fb Repair Tamazight username change setting label
Replace French with native change and username terminology matching the English source. Full composed label remains low confidence. All 17,271 correction/rendering checks pass.
2026-09-14 02:17:20 +03:00
Lauri Ojansivu e1d09b7a62 Update translation audit after comment prompt repair
Record 15,108 corrected originals, 736 pending and 17,270 exact corrections. Preserve low-confidence full-prompt review and broader validation scope. Audit and changelog tests pass.
2026-09-14 02:16:48 +03:00
Lauri Ojansivu 852beaa448 Repair French Tamazight comment deletion prompt
Compose native delete command and comment noun with question marking. Full prompt grammar remains low confidence and requires fluent review. All 17,270 correction/rendering checks pass.
2026-09-14 02:16:24 +03:00
Lauri Ojansivu ecca3aafdc Record Tamazight removal and filter translation repairs
Update dated audit and changelog with four unflagged repairs and 17,269 correction records. Original pending count remains 737. Report regressions pass; broader validation remains open.
2026-09-14 02:15:46 +03:00
Lauri Ojansivu 0b006e44d9 Repair Tamazight remove filter reset and user labels
Replace four Arabic labels with matching native UI terms. All 17,269 correction/rendering checks pass, preserving correct translations and placeholders. Broader linguistic validation remains open.
2026-09-14 02:15:25 +03:00
Lauri Ojansivu ccd9a29bb4 Record progress of Tamazight control wording repairs
Update dated audit and changelog with eleven unflagged repairs and 17,265 exact correction records. Original pending count stays 737. Audit and changelog regression suites pass; broader validation remains open.
2026-09-14 02:14:53 +03:00
Lauri Ojansivu d2923884d5 Repair Tamazight collapse rename and comment controls
Replace eleven Arabic labels with matching native UI terminology, preserving consistent popup headings and controls. All correction/rendering checks pass; broader linguistic validation remains unfinished.
2026-09-14 02:14:29 +03:00
Lauri Ojansivu b7ec8196eb Update audit after twelve Tamazight UI repairs
Record dated repair commit and 17,254 exact corrections. Original pending count remains 737; wider language validation stays open. Audit and changelog regression suites pass.
2026-09-14 02:13:56 +03:00
Lauri Ojansivu ebee06d86c Repair Tamazight account date and history UI labels
Replace twelve Arabic labels with matching native UI terminology, including distinct Date and History nouns and login/logout commands. Preserve correct translations. Correction and rendering regressions pass; broader linguistic validation remains open.
2026-09-14 02:13:33 +03:00
Lauri Ojansivu bd07621281 Record Tamazight action and error translation progress
Update dated repair summary and exact correction inventory. Original pending count stays 737; restored and low-confidence validation remains open. All audit and changelog regression suites pass.
2026-09-14 02:12:59 +03:00
Lauri Ojansivu b692ef9f48 Repair wrong-language Tamazight action and error labels
Use exact native MediaWiki equivalents for Actions, Create, Download and Error. All 17,242 correction/rendering checks pass; existing correct translations and placeholders are preserved. Wider linguistic review remains open.
2026-09-14 02:12:37 +03:00
Lauri Ojansivu 91b5e73351 Update translation progress after Tamazight UI repairs
Record two repairs outside the original finding inventory and unchanged 737 pending originals. Correction/rendering and audit/changelog regressions pass; broader linguistic review stays open.
2026-09-14 02:11:58 +03:00
Lauri Ojansivu 5f3cfb6086 Repair French help and next labels in Tamazight
Use matching native MediaWiki UI terms. Preserve valid Latin-script labels and newer translations. All 17,238 correction and rendering checks pass. Broader language validation remains unfinished.
2026-09-14 02:11:39 +03:00
Lauri Ojansivu e69c5d6e86 Update translation audit with Kashmiri reference gaps
Record dated reference review and unresolved full calendar qualifiers without changing repair counts or claiming linguistic completion. Correction inventory and all three audit/changelog regression suites pass.
2026-09-14 02:10:51 +03:00
Lauri Ojansivu 0db69cf6c7 Record provisional Kashmiri calendar names and unresolved epoch qualifiers
Keep existing wording during reference review. Unicode CLDR marks Islamic and civil labels provisional and supplies neither Saudi sighting nor astronomical tabular variant names. Full qualifiers require further Kashmiri technical terminology research. All 17,236 correction checks pass; no translation values changed.
2026-09-14 02:10:32 +03:00
Lauri Ojansivu 2c09ab6fd7 Record Cherokee variant repairs and remaining validation 2026-09-14 02:07:29 +03:00
Lauri Ojansivu e07d2be5f5 Repair Cherokee Hijri variant labels
Use exact native-script Unicode locale names for Saudi sighting and tabular variants. Verify variant distinctions and all 17,236 correction records. Keep compact epoch wording and broader linguistic validation open.
2026-09-14 02:07:06 +03:00
Lauri Ojansivu ba1df40778 Record Quechua metallic color repairs and linguistic review scope 2026-09-14 02:06:19 +03:00
Lauri Ojansivu 190fd16a2a Repair Quechua metallic color labels
Replace English gold and silver wrapped in unrelated prose with composed material-color wording. Record composition and palette adaptation as low confidence for technical review. All 17,234 correction checks pass.
2026-09-14 02:05:57 +03:00
Lauri Ojansivu a75c3309cf Record Quechua gray and purple repairs and remaining reviews 2026-09-14 02:04:36 +03:00
Lauri Ojansivu 89c0eb4669 Repair Quechua gray and purple labels
Use attested color adjectives and preserve their distinction from blue. Keep silver metal-to-color adaptation and wider palette validation unresolved. All 17,232 correction checks pass.
2026-09-14 02:04:14 +03:00
Lauri Ojansivu 7686dafb7c Record further Quechua color repairs and remaining reviews 2026-09-14 02:03:34 +03:00
Lauri Ojansivu 158f181524 Repair Quechua blue green and yellow labels
Use dictionary-attested standalone adjectives and verify six distinct repaired basic colors. Preserve unresolved orange and shade terminology for further research. All 17,230 correction records pass.
2026-09-14 02:03:10 +03:00
Lauri Ojansivu 56187787e3 Record Quechua color repairs and remaining audit scope 2026-09-14 02:02:28 +03:00
Lauri Ojansivu b7b810c1b0 Repair Quechua black red and white labels
Replace English color names wrapped in unrelated prose with dictionary-attested standalone adjectives. Verify distinct colors and all 17,227 exact correction records. Original calendar findings and wider validation remain open.
2026-09-14 02:02:05 +03:00
Lauri Ojansivu 05c58e2378 Record Tamazight notification repair and remaining work 2026-09-14 02:01:13 +03:00
Lauri Ojansivu 4cd6294947 Repair Tamazight delete-all-notifications action
Preserve all-notifications scope using existing terminology and reference-supported delete and all words. Track composed regional and technical wording as low confidence. All 17,224 exact correction checks pass.
2026-09-14 02:00:48 +03:00
Lauri Ojansivu 41d9ac8a7f Record Tamazight account repairs and pending validation 2026-09-14 01:59:50 +03:00
Lauri Ojansivu 123d7a531f Repair Tamazight core account translations
Replace seven Arabic and French labels with matching Standard Moroccan Tamazight reference wording. Verify native script, distinct login and logout, and all 17,223 exact correction records. Preserve correct local translations and keep wider validation open.
2026-09-14 01:59:28 +03:00
Lauri Ojansivu 2388dc73ca Record Aromanian color repair and remaining review 2026-09-14 01:58:32 +03:00
Lauri Ojansivu 02ef178a51 Repair Aromanian indigo color label
Use lulachi, explicitly attested as indigo in the publisher linguistic paper. Preserve lowercase color labeling and distinguish blue. Magenta and broader dialect and technical wording validation remain open. All 17,216 correction checks pass.
2026-09-14 01:58:11 +03:00
Lauri Ojansivu 6fc8359fb4 Record Bambara calendar repair and remaining audit work 2026-09-14 01:57:03 +03:00
Lauri Ojansivu 160e02ae3d Repair Bambara Hebrew calendar label
Use reference-attested Jewish terminology with the existing calendar construction. Record the composed name as low confidence pending fluent technical review. All 17,215 exact correction checks pass.
2026-09-14 01:56:41 +03:00
Lauri Ojansivu 95eae66686 Record Sakha sighting repair and remaining translation validation 2026-09-14 01:55:31 +03:00
Lauri Ojansivu 2ec5ad0e3f Repair Sakha Saudi sighting calendar label
Preserve Saudi Arabia and moon-observation qualifiers using native reference terms. Record low-confidence phrase composition and crescent-sighting adaptation for further review. Verify all 17,214 correction records and calendar variant distinctions.
2026-09-14 01:55:05 +03:00
Lauri Ojansivu 2470aabf95 Record Sakha astronomical-calendar repair and remaining sighting review
Refresh dated audit and Upcoming with passing checks and remaining technical validation. Thanks to xet7.
2026-09-14 01:51:35 +03:00
Lauri Ojansivu 36f57a4b74 Repair Sakha tabular Hijri astronomical-epoch label
Use native-reference astronomy wording and existing table/CLDR calendar-era terms, preserving both qualifiers and distinction from civil. Correction/rendering checks pass. Low confidence: noun composition and era-to-epoch adaptation need fluent technical review.

Thanks to xet7.
2026-09-14 01:51:16 +03:00
Lauri Ojansivu d155f89793 Record Sakha civil calendar repair and remaining variants
Refresh dated audit and Upcoming with passing checks and outstanding technical validation. Thanks to xet7.
2026-09-14 01:50:39 +03:00
Lauri Ojansivu bceecefb8c Repair Sakha civil Hijri calendar label
Replace English with reference-based calendar, table, civil and era wording. Preserve both qualifiers and the existing base. Correction/rendering checks pass. Low confidence: phrase composition and the era-to-epoch adaptation need fluent technical review. Other two variants remain unresolved.

Thanks to xet7.
2026-09-14 01:50:19 +03:00
Lauri Ojansivu d259217b38 Record Tongan astronomical-epoch refinement and review scope
Keep dated audit and Upcoming current without inflating repair counts or claiming fluent validation complete. Thanks to xet7.
2026-09-14 01:48:47 +03:00
Lauri Ojansivu 335a9bcd31 Restore astronomical-epoch meaning in Tongan tabular Hijri label
Refine the existing provisional repair using the lexicon epoch term and CLDR astronomical adjective. Preserve original correction provenance and distinguish calendar variants. All correction/rendering checks pass. Low confidence: the calendar base is CLDR-unconfirmed and phrase composition needs fluent technical review.

Thanks to xet7.
2026-09-14 01:48:27 +03:00
Lauri Ojansivu d566241d4a Record provisional Tongan calendar repair and unfinished epoch wording
Update dated progress without claiming the remaining linguistic validation complete. Thanks to xet7.
2026-09-14 01:46:45 +03:00
Lauri Ojansivu de0d3d8211 Replace English Tongan tabular Hijri calendar label with CLDR wording
Use the exact provisional non-core CLDR display name and retain distinctions from civil and sighting variants. Correction/rendering checks pass. Low confidence: the CLDR value is unconfirmed and an explicit astronomical-epoch qualifier still needs language research and fluent review.

Thanks to xet7.
2026-09-14 01:46:26 +03:00
Lauri Ojansivu c5f9faf4e3 Record dated Veps morphology validation in Upcoming
Link the local validation commit and retain unresolved technical terminology and pending counts. Thanks to xet7.
2026-09-14 01:45:12 +03:00
Lauri Ojansivu e4e3aa5908 Validate Veps zoom imperative forms against inflection references
Confirm the transitive increase/decrease commands from Veps inflection tables and distinguish intransitive forms. Preserve technical usage review and unresolved keyboard findings. All correction/rendering checks pass; counts are unchanged.

Thanks to xet7.
2026-09-14 01:44:58 +03:00
Lauri Ojansivu 796f74fe57 Record Veps zoom-scale repairs and outstanding technical review
Refresh dated audit and Upcoming with verified correction counts and remaining work. Thanks to xet7.
2026-09-14 01:43:41 +03:00
Lauri Ojansivu bc84ca78bc Repair Veps zoom scale label and percentage prompt
Replace two Finnish values with dictionary-based scale terminology and existing Veps prompt wording. Preserve the exact 50-300% range. Correction/rendering and placeholder checks pass. Low confidence: screen-zoom adaptation of the map-scale term and prompt inflection need fluent technical review.

Thanks to xet7.
2026-09-14 01:43:23 +03:00
Lauri Ojansivu 77c3214129 Record Veps zoom repair progress and remaining validation
Update dated audit and Upcoming with two unflagged repairs, unchanged original queue and passing verification. Thanks to xet7.
2026-09-14 01:42:46 +03:00
Lauri Ojansivu 85de9ea7db Repair Veps zoom-in and zoom-out actions
Replace two unflagged Finnish labels with distinct dictionary-based increase and decrease actions. Preserve zoom behavior and limits. Exact correction/rendering and token checks pass. Low confidence: technical usage and imperative forms need fluent review.

Thanks to xet7.
2026-09-14 01:42:29 +03:00
Lauri Ojansivu 9a16355771 Record Veps storage-engine translation repair and audit counts
Update dated progress and Upcoming with the local fix, passing correction checks and outstanding fluent technical review. Thanks to xet7.
2026-09-14 01:41:55 +03:00
Lauri Ojansivu 55c1973661 Replace Finnish MongoDB storage-engine label in Veps
Use dictionary-attested storage and engine words, preserving MongoDB. Exact correction, rendering and placeholder regressions pass. Low confidence: the composed technical label needs fluent review.

Thanks to xet7.
2026-09-14 01:41:36 +03:00
Lauri Ojansivu 82796edf06 Record Veps search repairs and translated overdue parser verification
Update dated translation progress to 15,095 corrected and 749 pending original findings. Record 17,205 verified correction records and the pending live browser and fluent-language checks. Thanks to xet7.
2026-09-14 01:40:58 +03:00
Lauri Ojansivu da63007903 Document missing-parent mirror recovery and final log reporting
Record the tested mirror fixes under Upcoming. Thanks to xet7.
2026-09-14 01:40:19 +03:00
Lauri Ojansivu b53d81cea0 Recover missing mirror comment parents and print final log paths
Fetch missing parent issues and pull metadata through the existing rate-limited API client. Preserve page checkpoints on failure and retry missing pull metadata after interruption. Report logs after menu sync/check operations and command exit while retaining exit status. Offline collector, menu and shell launcher regressions pass.

Thanks to xet7.
2026-09-14 01:40:05 +03:00
Lauri Ojansivu 6b0bf168e0 Repair Veps search help and recognize localized overdue predicates
Replace Finnish search explanations and the overdue keyword, preserving placeholders, examples and day bounds. Fix Query to use the translated overdue predicate map while retaining its existing English alias. Actual parser and all correction regressions pass. Add and syntax-check a browser regression; isolated live browser execution remains pending. Composed operator/date-bound language needs fluent review.

Thanks to xet7.
2026-09-14 01:36:46 +03:00
Lauri Ojansivu 55cb7eeee0 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 01:35:59 +03:00
Lauri Ojansivu 51e7efcd87 Record Veps recovery and migration-step translation progress
Refresh dated audit evidence and upcoming changelog with verified labels, remaining findings and language-review limitations.

Thanks to xet7.
2026-09-14 01:35:55 +03:00
Lauri Ojansivu a2929974e8 Repair Veps recovery labels and migration step names
Replace four Finnish labels, preserving per-swimlane and ensure-if-missing scope and distinguishing lost cards from restored items. Production rendering and all correction checks pass. Expanded ensure clauses and case agreement have low confidence and need fluent review.

Thanks to xet7.
2026-09-14 01:35:55 +03:00
Lauri Ojansivu 748f15e4d1 Record Veps conversion and migration progress repairs
Refresh dated audit evidence and upcoming changelog with verified explanations, remaining findings and explicit language-review limitations.

Thanks to xet7.
2026-09-14 01:35:55 +03:00
Lauri Ojansivu 83361230df Repair Veps board conversion and migration progress messages
Replace four Finnish explanations, preserving one-time scope, continued board use, performance improvement, brief duration and background continuation after browser closure. Production rendering and all correction checks pass. Technical performance/structure clause composition has low confidence and needs fluent review.

Thanks to xet7.
2026-09-14 01:35:55 +03:00
Lauri Ojansivu e50159cea9 Record Veps duplicate-list warning translation progress
Update dated audit evidence and upcoming changelog with verified safety conditions, remaining findings and language-review limitations.

Thanks to xet7.
2026-09-14 01:35:55 +03:00
Lauri Ojansivu 08d1f9e9b3 Repair Veps duplicate-list safety warnings
Replace three Finnish warnings, preserving empty-list and populated-same-name-duplicate conditions, initial shared-list conversion and redundant-only deletion. Read the migration implementation and verify production rendering and all correction invariants. Composed clauses and case agreement have low confidence and need fluent review.

Thanks to xet7.
2026-09-14 01:35:55 +03:00
Lauri Ojansivu 951b7c09d2 Record Veps migration integrity translation progress
Refresh dated audit evidence and upcoming changelog with verified messages, remaining findings and language-review limitations.

Thanks to xet7.
2026-09-14 01:35:55 +03:00
Lauri Ojansivu ef7d530e93 Repair Veps migration integrity explanations
Replace six Finnish migration/settings values, preserving list ordering, card positions, swimlane structure, independent execution and brief duration. Production rendering and all correction checks pass; composed purpose clauses and case agreement need fluent review.

Thanks to xet7.
2026-09-14 01:35:55 +03:00
Lauri Ojansivu 8e3aa7d3d2 Record Veps board-migration translation progress
Refresh the dated audit and upcoming changelog with verified migration labels, remaining findings and explicit language-review limitations.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu c6eaeb9cea Repair Veps board-structure migration controls
Replace five Finnish values, preserving comprehensive migration scope, analysis, missing/corrupt list alternatives and continuation confirmation. Production rendering and all correction checks pass. Technical structure terminology and absent-list clause composition have low confidence and need fluent review.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 10eb3682b1 Record Veps wait-animation translation progress
Update the dated audit and upcoming changelog with verified labels, remaining findings and explicit terminology-review caveats.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 66cd9b69e9 Repair Veps wait-spinner descriptions
Replace nine Finnish wait-animation labels while preserving all animation distinctions and identifiers. Production rendering and all correction checks pass. The technical cube loan and composed wait-indicator terminology have low confidence and require fluent review.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 25bbbbc0f3 Record Veps spent-time repair progress and shorten review summary
Refresh the dated audit and upcoming changelog. Condense review categories while retaining all per-key confidence caveats in the correction ledger and source commits.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 182983fe27 Repair Veps spent-time card and hours labels
Replace Finnish spent-time values, retaining the distinction between boards with tracked-time cards and the hours field. Production rendering and all correction checks pass. The composed tracked-time-card phrase has low confidence and needs fluent review.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu a42492bfa8 Record Veps device-mode and PDF translation progress
Refresh dated evidence and upcoming changelog with verified controls, remaining findings and language-review limitations.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 27e76175d7 Repair Veps device modes and PDF preview fallback
Replace four Finnish values while preserving distinct mobile/desktop modes and the alternative download action. Production rendering and all correction checks pass. Mobile-device compounds and PDF-preview inflection have low confidence and need fluent review.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu e10aafdfae Record Veps announcement and repository translation progress
Refresh the dated audit and upcoming changelog with verified controls, remaining findings and explicit terminology-review limitations.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 2c1b453edc Repair Veps announcement and repository controls
Replace ten Finnish values, preserving system-wide and administrator announcement distinctions, create/upload/update/sign-in actions and the existing repository noun. All correction and production-rendering checks pass. Repository inflection and the system-wide qualifier have low confidence and need fluent review.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu c8a577f741 Record mirror security review and verified hardening
Update the upcoming changelog and audit progress with saved alert findings, twenty-five passing mirror regressions and native Windows/CodeQL verification limits.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 3a86fc7e34 Harden mirror host validation and shell-free command dispatch
Review saved scanning alerts 537 and 539. Make exact archive-host validation explicit, restrict executable dispatch and run Windows targets through the existing Node engine without cmd.exe command strings. Preserve preview flags and all archive/resume behavior. Twenty-five focused mirror test entries pass; native Windows and remote CodeQL rescanning remain unverified.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu b3dc5f6ee5 Record Veps timing and shortcut translation refinement
Update the dated audit and upcoming changelog with verified repairs, the earlier pronoun correction and remaining language-validation work.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu c0bd1cecb5 Repair Veps remaining-time label and assigned-card pronoun
Replace the Finnish timing label and refine an earlier shortcut correction from assigned to you to assigned to me. Preserve the original before-value in the correction ledger. Production rendering and all correction checks pass; timing participle composition needs fluent review.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 05fcb2e76c Record verified Veps drag and sidebar translation progress
Refresh dated repair evidence, remaining findings and explicit fluent-review limitations in the audit and upcoming changelog.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu db9a1e001b Repair Veps drag instructions and sidebar controls
Replace eight Finnish/Venda instructions, preserving click, drag, drop, resize, opening and closing distinctions and workspace placeholders. All correction and production-rendering checks pass. Icon inflection and desktop drag-handle compounds have low confidence and need fluent review.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 32e41d165c Record Veps workspace translation progress
Update the dated audit and upcoming changelog with the verified workspace batch, remaining findings and explicit language-review limitations.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu f72f222543 Repair Veps workspace controls and submenu labels
Replace thirteen Finnish values, preserving workspace/subworkspace distinctions, markdown notation and the existing Veps deletion question. Verify production rendering and all correction invariants. Composed subworkspace and technical icon terminology have low confidence and need fluent review.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 116f4ecadf Add Meteor skills audit to upcoming changelog
Summarize the source review and distinguish open improvements from completed fixes.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu ab05c974d1 Document Meteor skills source audit and remaining improvements
Record confirmed search, browser-policy and popup findings, existing safeguards and the limits of focused verification.

Thanks to xet7.
2026-09-14 01:35:54 +03:00
Lauri Ojansivu 0a7d5c394e Record subtask translation repairs and remaining language reviews 2026-09-14 01:35:54 +03:00
Lauri Ojansivu fe8a520764 Repair Veps subtask destination and action controls
Replace nine Finnish values, preserving board/list destinations, matching-card absence, deletion confirmation and the board placeholder. Verify actual rendering and retain the existing subtask heading. Composed destination and matching-card grammar need fluent review.

Thanks to xet7 !
2026-09-14 01:35:54 +03:00
Lauri Ojansivu fb4256912b Record mention notification repair and remaining translation validation 2026-09-14 01:35:53 +03:00
Lauri Ojansivu 8a1c76264f Repair Veps card mention notification
Replace Finnish prose using attested naming vocabulary and existing card/list/swimlane/board location phrases. Verify actual rendering with all five placeholders. Mention adaptation and composed notification grammar have low confidence and need fluent review.

Thanks to xet7 !
2026-09-14 01:35:53 +03:00
Lauri Ojansivu 9a9a12c6a4 Record wildcard guidance repairs and remaining audit counts 2026-09-14 01:35:53 +03:00
Lauri Ojansivu 28f37f0ab0 Repair Veps wildcard and board-shortcut guidance
Translate empty-field matching and starring a board to add its navigation link. Verify actual rendering and preserve tokens and existing star hint. Composed wildcard grammar and navigation-bar terminology need fluent review.

Thanks to xet7 !
2026-09-14 01:35:53 +03:00
Lauri Ojansivu d59f442476 Record Ewe civil-calendar repair and remaining language research 2026-09-14 01:35:53 +03:00
Lauri Ojansivu 60d14076a2 Localize Ewe civil Hijri calendar name
Use Unicode CLDR Ewe islamic-civil terminology and verify actual locale rendering, preserving source tokens. CLDR marks the name provisional; native validation remains required.

Thanks to xet7 !
2026-09-14 01:35:53 +03:00
Lauri Ojansivu 1fee87fc8f Record Fulah and Bambara calendar qualifier repairs 2026-09-14 01:35:53 +03:00
Lauri Ojansivu ff742c4146 Localize Persian calendar qualifiers in Fulah and Bambara
Use Unicode CLDR Persian language names and existing calendar nouns while preserving Jalali identity and distinction from Hijri. Verify actual locale rendering and token inventories. Technical calendar-name composition needs native review.

Thanks to xet7 !
2026-09-14 01:35:53 +03:00
Lauri Ojansivu dab830e94a Record action-choice repairs and outstanding translation reviews 2026-09-14 01:35:53 +03:00
Lauri Ojansivu 25dbf64093 Repair Veps multi-selection action choice translations
Replace four Finnish values in label and member action popups. Preserve existing correct assignment and label-removal wording and verify rendering. Composed title grammar needs fluent review; apparent reversed member handlers remain a separate review item.

Thanks to xet7 !
2026-09-14 01:35:53 +03:00
Lauri Ojansivu 1cd9370b12 Record Neapolitan item repairs and remaining translation reviews 2026-09-14 01:35:53 +03:00
Lauri Ojansivu 62c011b86b Repair Neapolitan rule item label and list example
Use dictionary-attested alimento, keeping all three comma-separated entries and numeric suffixes. Verify production rendering and token preservation. Technical checklist use needs native review.

Thanks to xet7 !
2026-09-14 01:35:53 +03:00
Lauri Ojansivu 4848654ef0 Record dated board-view repairs and remaining translation validation 2026-09-14 01:35:53 +03:00
github-actions[bot] e31410b330 Bump versions for v11.73 2026-09-13 21:57:44 +00:00
Lauri Ojansivu 4cc67232fe Prepare v11.73 release 2026-09-14 00:56:14 +03:00
Lauri Ojansivu 19d4abdf75 Repair Veps board-view labels and current-time action
Replace nine Finnish or Venda labels, preserving single versus multiple-board calendars, existing list and time terminology and Gantt proper names. Verify production rendering. Composed view-name grammar and collapse terminology have low confidence and require fluent review.

Thanks to xet7 !
2026-09-14 00:55:57 +03:00
Lauri Ojansivu df3efbbbc5 Record dated file-storage translation repairs and remaining audit work 2026-09-14 00:55:04 +03:00
Lauri Ojansivu fcb7fdaf9c Repair Veps file-storage and invalid-filename guidance
Replace five Finnish values while retaining avatar storage, writable and base-directory paths, and upload-or-rename cancellation. Verify production rendering and preserve existing attachment-path wording. Base-folder terminology and cancellation grammar have low confidence and require fluent review.

Thanks to xet7 !
2026-09-14 00:54:43 +03:00
Lauri Ojansivu 63c64af1f4 Record notification translation repairs and remaining review counts 2026-09-14 00:53:39 +03:00
Lauri Ojansivu 1b5fb61c8d Repair Veps notification read-state controls
Replace four Finnish values while retaining unread filtering, read/unread marking and read-only deletion. Preserve the existing correct unread-comment phrase and verify production rendering. Unread participle inflection and composed notification grammar have low confidence and need fluent review.

Thanks to xet7 !
2026-09-14 00:53:20 +03:00
Lauri Ojansivu 653946f276 Record dated Veps memory translation repairs and remaining audit work 2026-09-14 00:52:04 +03:00
Lauri Ojansivu 4824585987 Repair Veps Node memory usage labels
Replace Finnish labels with Veps and distinguish resident RAM, allocated heap, actual heap use and external memory. Verify production rendering and preserve all source tokens. Composed technical grammar has low confidence and needs fluent review.

Thanks to xet7 !
2026-09-14 00:51:43 +03:00
Lauri Ojansivu 9795d88f72 Document first-user CSS and unrequested 2FA prompt repairs
Record successful Meteor compilation, Node regressions and Chromium/Firefox verification against an empty database. Changelog checks pass.

Thanks to xet7.
2026-09-14 00:47:55 +03:00
Lauri Ojansivu cc2833cd0e Restore app CSS and hide unrequested two-factor challenges
Override Meteor's native CSS module type for the existing style-loader/css-loader pipeline. Initialize the second-factor form with a literal native hidden attribute and toggle it only on the existing challenge/cancel paths.

Meteor bundle compilation, four Node test entries and Chromium/Firefox checks pass against an isolated database with zero users. Signed-out sign-in and sign-up remain styled without an unsolicited challenge, even if its hide class is removed.

Thanks to xet7.
2026-09-14 00:47:27 +03:00
Lauri Ojansivu 0602302196 Record dated archive translation repairs and remaining review work
Update Audit.md and TODO Later with 803 pending original findings, exact repair counts and low-confidence warning terminology. Metadata checks pass.

Thanks to xet7.
2026-09-14 00:42:10 +03:00
Lauri Ojansivu 181585ce66 Repair Veps archive actions and linked-deletion warnings
Replace thirteen Finnish values while preserving restoration guidance, archive destinations, deletion order and linkedId sentence fragments. Keep the existing correct archive label unchanged.

Composed warning grammar and home-header/button terminology remain low confidence. All 17,090 correction/rendering regressions pass.

Thanks to xet7.
2026-09-14 00:41:47 +03:00
Lauri Ojansivu bda93e7d89 Record dated Veps clipboard repairs and outstanding audit work
Refresh Audit.md and TODO Later with exact correction totals, 806 pending original findings and uncertain confirmation grammar. Changelog and audit metadata checks pass.

Thanks to xet7.
2026-09-14 00:40:30 +03:00
Lauri Ojansivu d41db1a2c1 Repair Veps clipboard and unsaved-description messages
Replace seven Finnish values with attested clipboard terminology and dictionary-supported copy/paste and description wording. Preserve image-only pasting, before-closing unsaved conditions and the overwrite question. Existing correct clipboard text remains unchanged.

Composed confirmation grammar and inflection remain low confidence. All 17,077 correction/rendering regressions pass.

Thanks to xet7.
2026-09-14 00:40:05 +03:00
Lauri Ojansivu 5ad13848b4 Record Veps search repairs and current audit progress
Update dated repair commits, remaining findings and uncertain-language review scope. Distinguish parser/rendering tests from outstanding database-result and live browser verification. Metadata checks pass.

Thanks to xet7.
2026-09-14 00:38:33 +03:00
Lauri Ojansivu 3ab93c5551 Repair Veps Boolean-search explanations and examples
Preserve ANY condition for repeated operators versus ALL conditions for differing operators. Dictionary-supported Veps prose and sample values replace Finnish; composed logical grammar remains low confidence.

Actual parser grouping and all 17,070 correction regressions pass.

Thanks to xet7.
2026-09-14 00:37:57 +03:00
Lauri Ojansivu 2879c13215 Repair Veps presence-search keywords and instructions
Translate ten Finnish values with single-word parser keywords and a working negative due-date example. Preserve all field placeholders and presence/absence meanings. Composed instructional grammar is low confidence and requires fluent review.

Actual Query presence/absence checks and invalid-field rejection pass, alongside all 17,068 correction regressions.

Thanks to xet7.
2026-09-14 00:36:54 +03:00
Lauri Ojansivu d646be0b78 Record dated Veps scheduling repairs and remaining audit work
Refresh Audit.md and TODO Later with 817 pending original findings, exact correction totals and low-confidence grammar requiring review. Changelog and audit metadata checks pass.

Thanks to xet7.
2026-09-14 00:35:18 +03:00
Lauri Ojansivu 036ea09e2f Repair Veps board scheduling messages and cleanup labels
Replace sixteen Finnish values, preserving scheduling failures versus operation failures, successful scheduling and coming-soon functionality. Reuse existing job and backup terminology with dictionary-supported cleanup wording.

Composed scheduling syntax and backup/archive inflection are low confidence and require fluent review. All 17,058 correction records pass runtime rendering, placeholders, key order and human-preference regressions.

Thanks to xet7.
2026-09-14 00:34:59 +03:00
Lauri Ojansivu 109775e8d8 Update translation audit progress and remaining review summary
Record dated Veps heap repairs, 829 remaining original findings and low-confidence terminology. Refresh TODO Later counts and distinguish historical full-suite verification from current correction checks.

Thanks to xet7.
2026-09-14 00:33:28 +03:00
Lauri Ojansivu e7b7cc7605 Repair Veps heap metric labels and allocation meanings
Replace eleven Finnish memory labels with Veps terminology; distinguish peak malloc allocation from erroneous memory and the V8 debug overwrite flag from garbage collection. Preserve metric distinctions and identifiers.

Technical compounds and inflection are low confidence and require fluent review. Runtime rendering, token, key-order and human-preference regressions pass for 17,042 correction records.

Thanks to xet7.
2026-09-14 00:33:02 +03:00
Lauri Ojansivu 366316395d Record successful development and release build verification
Document completion log paths, read-only manifest repair and successful Linux arm64 builds with release startup validation. Keep translation audit status unchanged. Changelog and audit metadata checks pass.

Thanks to xet7.
2026-09-14 00:31:13 +03:00
Lauri Ojansivu 3fedee2b91 Report completed build logs and prepare read-only server manifests
Print development and release log paths at completion on shell and Windows builds. Match the release workflow by making Meteor's server package manifest writable before updating node-gyp and installing dependencies.

Add completion/failure and read-only-manifest regressions. Development compilation and release startup smoke check pass on Linux arm64; 13 targeted test entries pass. Native Windows execution is unavailable.

Thanks to xet7.
2026-09-14 00:30:44 +03:00
Lauri Ojansivu 955ce9337a Record Veps consent notification repairs and remaining audit work 2026-09-14 00:22:08 +03:00
Lauri Ojansivu 5fbd310063 Repair Veps consent notice and notification subscription wording
Replace eight Finnish values, resolving six original findings and two unflagged watch labels. Preserve combined consent text, never-notified state, creator OR member and watch subscriptions. Runtime checks pass. Legal argument case and composed technical grammar remain low confidence pending fluent review.
2026-09-14 00:21:53 +03:00
Lauri Ojansivu 45b21732cd Record Veps tooltip repairs and remaining translation audit work 2026-09-14 00:19:52 +03:00
Lauri Ojansivu e71dd2d4f4 Repair Veps starring and automatic list width tooltips
Replace six original Finnish findings. Preserve star/unstar, board-list top placement and opposite enabled/disabled actions. Dictionary and runtime checks pass; composed morphology remains low confidence pending fluent review.
2026-09-14 00:19:37 +03:00
Lauri Ojansivu 424ecf71ec Record Veps monitoring translation repairs and remaining audit progress 2026-09-14 00:18:33 +03:00
Lauri Ojansivu c2a8c9b2e9 Repair Veps monitoring reconnect and server error instructions
Replace seven Finnish values, resolving four original findings and three unflagged monitoring labels. Preserve separate export/refresh failures, reconnect retry and server-generated error meaning; retain exact Snap/Docker command text. Runtime checks pass. Technical grammar remains low confidence pending fluent review.
2026-09-14 00:18:16 +03:00
Lauri Ojansivu 752208c61d Record Veps operator instruction repairs and remaining audit work 2026-09-14 00:17:12 +03:00
Lauri Ojansivu 50337aea33 Repair Veps label status sort and limit search instructions
Replace eight Finnish values, resolving five original findings and three unflagged errors. Preserve color-or-name matching, positive per-page limits, status choices and descending minus syntax. Localize user shorthand and fix unmatched label emphasis. Production Query and renderer checks pass; composed grammar remains low confidence pending fluent review.
2026-09-14 00:16:57 +03:00
Lauri Ojansivu 5eccd7fb80 Record Veps date search repairs and remaining translation audit work 2026-09-14 00:15:08 +03:00
Lauri Ojansivu 68a54ec5bb Repair Veps date search periods sorting and case instructions
Replace twelve Finnish values, resolving four original findings and eight unflagged errors. Preserve date bounds, signed integers, period placeholders and case-insensitivity wording. Production Query verifies localized date-sort predicates and invalid date operands; runtime checks preserve period interpolation. Technical grammar remains low confidence pending fluent review.
2026-09-14 00:14:53 +03:00
Lauri Ojansivu 8bea799877 Record Veps system metric repairs and translation audit progress 2026-09-14 00:13:24 +03:00
Lauri Ojansivu 53775ffba8 Repair Veps operating system and memory metric translations
Replace ten Finnish values, resolving eight original findings and two unflagged labels. Preserve OS/CPU identifiers and distinct architecture, platform, release, free/total memory, load average, CPU count and uptime metrics. Runtime checks pass; technical adaptations remain low confidence pending fluent review.
2026-09-14 00:13:08 +03:00
Lauri Ojansivu b834ebd5a9 Record Veps customization repairs and remaining translation audit work 2026-09-14 00:12:12 +03:00
Lauri Ojansivu fc6c780dcf Repair Veps customization labels and top-left logo direction
Replace fifteen original Finnish findings. Correct right-versus-left logo placement, preserve URL/HTML/JSON and assetlinks.json literals, head/link/meta distinctions and default height 27. Runtime and positive/negative terminology checks pass. Adapted technical loans and composed morphology remain low confidence pending fluent review.
2026-09-14 00:11:57 +03:00
Lauri Ojansivu aad756cd79 Record Veps board warning repairs and remaining translation findings 2026-09-14 00:10:19 +03:00
Lauri Ojansivu 8002bb1395 Repair Veps board confirmations and Excel disk space warning
Replace seven Finnish values, resolving five original findings and two unflagged action labels. Preserve board title interpolation, removal from every board card, duplication and insufficient available disk space. Runtime and positive/negative wording checks pass. Technical morphology remains low confidence pending fluent review.
2026-09-14 00:10:06 +03:00
Lauri Ojansivu f494c6e4fe Record Veps export translation repairs and remaining audit progress 2026-09-14 00:08:38 +03:00
Lauri Ojansivu 852c7d8ef9 Repair Veps export fields owner and checklist line instructions
Replace six Finnish values, resolving five original findings and one unflagged owner label. Preserve four distinct people roles, three board-location fields, one checklist item per text line and original order. Runtime checks pass; composed technical morphology remains low confidence pending fluent review.
2026-09-14 00:08:23 +03:00
Lauri Ojansivu e55659070c Record Veps card translation repairs and remaining original findings 2026-09-14 00:07:12 +03:00
Lauri Ojansivu 2011620376 Use dictionary-attested Veps numbered-item term for card sorting 2026-09-14 00:06:57 +03:00
Lauri Ojansivu 2d7a83106c Repair Veps card copy sorting and member permission translations
Replace nine originally flagged Finnish values. Preserve literal JSON fields and first/second/last examples, minicard placement, checklist template source, settings prohibition and at least one administrator. Runtime and JSON regression checks pass. Composed technical morphology remains low confidence pending fluent review.
2026-09-14 00:06:41 +03:00
Lauri Ojansivu 5247d70b9f Record Veps search validation repairs and remaining audit progress 2026-09-14 00:05:17 +03:00
Lauri Ojansivu 1a44f6accc Repair Veps search validation errors and limit operator
Replace eight Finnish values, resolving six original findings and two unflagged errors. Preserve placeholders and separate number, sorting, status, existence, debug and limit meanings. Verify runtime rendering and positive/negative production Query limit behavior. Technical morphology remains low confidence pending fluent review.
2026-09-14 00:05:03 +03:00
Lauri Ojansivu 8466ebde6f Update September 14 translation audit progress after Veps search repairs 2026-09-14 00:03:59 +03:00
Lauri Ojansivu 69582cb2c1 Repair Veps user creator and ended-status search translations
Replace ten Finnish values, resolving five original findings and five unflagged errors. Preserve member OR assignee, creator distinction, end-date status and default archive exclusion. Verify localized terms through production Query and runtime rendering. Composed technical grammar remains low confidence pending fluent review.
2026-09-14 00:03:44 +03:00
Lauri Ojansivu 2f5b14ad20 Record unified logging layout and verification on September 14 2026-09-14 00:02:44 +03:00
Lauri Ojansivu 5f8f22f8c3 Unify shell and Windows log directories by operation date and time 2026-09-14 00:02:30 +03:00
Lauri Ojansivu eb5cb92bcc Document separate date and time directories for build logs 2026-09-13 23:59:05 +03:00
Lauri Ojansivu 0fdda91dec Separate repeated build logs into date and time directories 2026-09-13 23:58:51 +03:00
Lauri Ojansivu 63018cc5a3 Record Veps search translation repairs and remaining audit work 2026-09-13 23:58:00 +03:00
Lauri Ojansivu 1fe3558be7 Repair Veps search operators and entity instructions
Replace eleven Finnish or mixed-language values, resolving six original findings and five unflagged errors. Preserve all placeholders and test five localized operators through production Query with quoted values. Use a single-word assignee operator because the parser rejects spaces. Technical case and relative-clause wording need fluent review.
2026-09-13 23:57:45 +03:00
Lauri Ojansivu d4704b11bc Document daily build log locations and successful development build 2026-09-13 23:56:11 +03:00
Lauri Ojansivu 002e6faa76 Log development and release builds by build type and day 2026-09-13 23:55:57 +03:00
Lauri Ojansivu f4fdcfa7bc Record Veps scheduled-job translation repairs and audit progress 2026-09-13 23:54:11 +03:00
Lauri Ojansivu d8b2356420 Correct dictionary inflection of Veps scheduled job objects 2026-09-13 23:53:57 +03:00
Lauri Ojansivu f64d43aec4 Repair Veps scheduled job actions and outcome notifications
Replace eleven Finnish values, resolving ten original findings and one unflagged value. Preserve assigned-time job meaning, deletion confirmation, active jobs, and delete/pause/resume/start success versus failure. Composed scheduling terminology and morphology need fluent-speaker review.
2026-09-13 23:53:35 +03:00
Lauri Ojansivu 1e69b1d76e Update translation audit progress after Veps migration warning repair 2026-09-13 23:52:29 +03:00
Lauri Ojansivu 34708699c2 Repair Veps migration steps and preserve the browser warning
Replace ten Finnish values, including one original flagged warning. Preserve restore targets, validation and continued background processing with potentially longer completion. Composed technical grammar is low confidence pending fluent-speaker review.
2026-09-13 23:52:14 +03:00
Lauri Ojansivu 187c7b9db4 Record dated Veps migration translation repairs and remaining audit work 2026-09-13 23:50:56 +03:00
Lauri Ojansivu 782cd2fc7a Repair Veps migration controls and status labels
Replace eleven unflagged Finnish values with Veps dictionary terminology. Preserve distinct pause, resume and stop actions and consistent detail/status labels. Composed technical wording remains low confidence pending fluent-speaker review.
2026-09-13 23:50:43 +03:00
Lauri Ojansivu 349dab2bd1 Record incremental mirror resume and build resolver diagnostics verification 2026-09-13 23:49:33 +03:00
Lauri Ojansivu 7af015a56b Persist GitHub mirror data incrementally and resume interrupted synchronization 2026-09-13 23:49:16 +03:00
Lauri Ojansivu df4c049d52 Show module resolution and captured dependency command output during builds 2026-09-13 23:49:12 +03:00
Lauri Ojansivu 915971a89c Expose exact build commands and verbose npm and Meteor diagnostics
Correct the npm-update stage to describe its application compilation for Meteor plugin dependencies. Enable verbose npm logging, foreground lifecycle scripts, Meteor timing diagnostics and supported verbose bundle compilation. Preserve unbuffered stdout/stderr and test command output plus supported options.

Thanks to xet7 !
2026-09-13 23:42:18 +03:00
Lauri Ojansivu 5ff0e5d5d7 Record Veps comment repair progress and the archive-saving interruption
Thanks to xet7 !
2026-09-13 23:33:57 +03:00
Lauri Ojansivu a0048dafd0 Repair Veps comment labels and localized comment searches
Use existing Veps comment terminology for counts, minicards, unread/absent states, roles and search instructions. Preserve sprintf and interpolation tokens. Verify actual production Query parsing with the apostrophe-containing operator, quoted multiword values and unknown-operator rejection. Composed relative-clause/count/case grammar is low confidence and needs fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:33:36 +03:00
Lauri Ojansivu 3bafb2f87c Update translation audit after Veps permission and import error repairs
Thanks to xet7 !
2026-09-13 23:31:56 +03:00
Lauri Ojansivu 3f9517869d Repair Veps permissions, authentication and import validation messages
Replace Finnish and Venda values with consistent Veps messages. Preserve administrator/member requirements, username-or-password errors, comma/Tab delimiters, self-invitation restrictions and domain ownership. Align the invitation-code label with existing registration emails. All exact correction and runtime checks pass. Composed import-schema, login-event, domain ownership and case grammar are low confidence and need fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:31:39 +03:00
Lauri Ojansivu 41d715fe4c Record translation audit progress after Veps deletion warning repairs
Thanks to xet7 !
2026-09-13 23:29:57 +03:00
Lauri Ojansivu 21ca9ac3a4 Repair Veps deletion confirmations and irreversible-loss warnings
Replace Finnish warnings for cards, labels, board contents, accounts, comments, checklists, checklist items and subtasks. Preserve permanent deletion, history/activity loss and inability to restore or reopen. Verify positive targets and negative target distinctions with runtime translations. Composed board-content wording, account loan inflection and definite-object grammar are low confidence and need fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:29:33 +03:00
Lauri Ojansivu b89d0131d4 Update translation audit progress after Veps visibility repairs
Thanks to xet7 !
2026-09-13 23:28:27 +03:00
Lauri Ojansivu 7001474778 Repair Veps board visibility descriptions and search predicates
Replace Finnish and Venda values with Veps private/public labels, permission descriptions and custom/default visibility controls. Preserve HTML, URLs and query token semantics; verify the production Query parser against the repaired locale. Composed visibility/search-engine wording and case grammar are low confidence and need fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:28:07 +03:00
Lauri Ojansivu 5dc62ed733 Document build progress reporting in the upcoming changelog
Thanks to xet7 !
2026-09-13 23:27:19 +03:00
Lauri Ojansivu 9aae0ee309 Show immediate build stages and periodic progress for quiet commands
Stream stage announcements, elapsed status and exit codes into the build log. Stop after required cache cleanup or dependency installation failures. Verify quiet command progress and failure propagation with offline fixtures.

Thanks to xet7 !
2026-09-13 23:27:05 +03:00
Lauri Ojansivu 3fc3d64a7c Document header collapse placement in Upcoming release
Record the Home-collapse-title ordering, passing header regressions and registered browser coverage with runtime limitations.

Thanks to xet7 !
2026-09-13 23:20:30 +03:00
Lauri Ojansivu 8cfee93830 Move header collapse control beside Home
Place the existing collapse control immediately after Home and before the page or board title. Preserve per-session collapse behavior and themed layout. Update header ordering guards and add desktop/narrow-layout browser coverage for position and retained Home/title visibility.

Five header suites pass. Browser regression syntax-checks and registers; runtime execution requires a running WeKan server, which is unavailable locally.

Thanks to xet7 !
2026-09-13 23:20:09 +03:00
Lauri Ojansivu f135b173b2 Record Veps WIP repairs and remaining audit work
Update dated fix hash, audit summary, TODO Later counts and Upcoming release notes. Three original findings and ten related errors repaired; 963 original findings remain.

Thanks to xet7 !
2026-09-13 23:18:47 +03:00
Lauri Ojansivu c847829daa Repair Veps WIP limit and group controls
Replace thirteen Finnish values and mislabeled group controls. Preserve enable/edit/set/soft/invalid distinctions, maximum task count, strict higher-than warning, move-out or higher-limit remedies, optional names and swimlane selection/application.

Low confidence: composed WIP labels and count/remediation grammar need fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:18:11 +03:00
Lauri Ojansivu 0e643d78c1 Record Veps migration status repairs and audit progress
Update dated fix hash, audit summary, TODO Later counts and Upcoming release notes. Seven original findings and two related errors repaired; 966 original findings remain.

Thanks to xet7 !
2026-09-13 23:16:33 +03:00
Lauri Ojansivu 6cc4055afa Repair Veps migration retry and resume status text
Replace nine Finnish values; distinguish failed-only retries, paused-only continuation, empty queues, successful action responses, errors and warnings. Preserve existing native status translations and verify actual locale rendering.

Low confidence: composed failure-status grammar and plural/case forms require fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:16:14 +03:00
Lauri Ojansivu e053ba9e62 Record Veps recovery repairs and remaining audit work
Update dated fix hash, audit summary, TODO Later counts and Upcoming release notes. Eleven original findings and one related error repaired; 973 original findings remain.

Thanks to xet7 !
2026-09-13 23:14:23 +03:00
Lauri Ojansivu eef7868928 Repair Veps archive and recovery translations
Replace twelve Finnish values. Preserve later recovery, retained activity, all archived versus non-archived lost-item scope, exact identifier names, automatic repair and cannot-easily-undo wording. Add actual rendering and negative scope regressions.

Low confidence: composed recovery grammar and plural/case forms require fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:13:59 +03:00
Lauri Ojansivu 837555faf2 Record Veps webhook repairs and remaining terminology review
Update dated fix hash, audit summary, TODO Later counts and Upcoming release notes. Five original findings and six related errors repaired; 984 original findings remain.

Thanks to xet7 !
2026-09-13 23:11:49 +03:00
Lauri Ojansivu 9b968a7a6b Repair Veps webhook labels and creation guidance
Replace eleven Finnish values, including related shortcut actions and unflagged labels. Preserve optional authentication, outbound/two-way/global semantics, disabling versus deletion, organization/team guidance and personal versus assigned-card filtering.

Low confidence: composed Veps labels and contact guidance need fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:11:29 +03:00
Lauri Ojansivu a99cbd079d Record Veps warning repairs and audit progress
Update dated fix hash, audit summary, TODO Later counts and Upcoming release notes. Four original findings resolved; 989 remain alongside restored and unflagged validation.

Thanks to xet7 !
2026-09-13 23:09:16 +03:00
Lauri Ojansivu 1d93c1a864 Repair Veps search and permission warnings
Replace four Finnish values and verify the literal Enter key, worker-only move/self-assignment/comment permissions, unsaved description state and irreversible loss of all swimlane actions.

Low confidence: composed Veps grammar and inflections require fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:08:57 +03:00
Lauri Ojansivu ede6176aa6 Record Veps notification repairs and remaining audit work
Update dated fix hash, audit and TODO Later counts, and Upcoming release summary. Six original findings resolved; 993 remain, alongside restored and unflagged validation.

Thanks to xet7 !
2026-09-13 23:07:29 +03:00
Lauri Ojansivu bd1b57aacb Repair Veps notification and archive help translations
Replace six Finnish values, preserve creator-or-member and board notification scope, signed-in-only support, archive location and swimlane name formatting. Verify actual locale rendering and negative scope checks.

Low confidence: composed Veps grammar and inflections need fluent-speaker review.

Thanks to xet7 !
2026-09-13 23:07:08 +03:00
Lauri Ojansivu e289c28e28 Record Veps storage repairs and remaining translation reviews 2026-09-13 23:03:00 +03:00
Lauri Ojansivu bc06fade8b Repair Veps board attachment and migration control text 2026-09-13 23:02:40 +03:00
Lauri Ojansivu c90a1569aa Record Veps organization repairs and remaining audit work 2026-09-13 23:00:31 +03:00
Lauri Ojansivu 15547544bc Repair Veps organization and team management translations 2026-09-13 23:00:09 +03:00
Lauri Ojansivu 33cf1a0448 Record Veps window repairs and remaining translation reviews 2026-09-13 22:57:48 +03:00
Lauri Ojansivu d67d506b55 Repair Veps card window template and loading instructions 2026-09-13 22:57:29 +03:00
Lauri Ojansivu 9e5024877b Record Veps voting repairs and remaining translation work 2026-09-13 22:55:30 +03:00
Lauri Ojansivu 67fb504d5d Repair Veps voting cover and custom translation controls 2026-09-13 22:55:11 +03:00
Lauri Ojansivu 5a250db062 Record Veps login repair progress and remaining reviews 2026-09-13 22:53:41 +03:00
Lauri Ojansivu b233c7fdaa Repair Veps login protection and lockout settings 2026-09-13 22:53:21 +03:00
Lauri Ojansivu 956c8f619c Record Veps account repair progress and remaining audit work 2026-09-13 22:51:39 +03:00
Lauri Ojansivu 3a4196abb9 Repair Veps account emails and notification deletion text 2026-09-13 22:51:14 +03:00
Lauri Ojansivu 17fe54a555 Record Veps rule repairs and remaining translation reviews 2026-09-13 22:49:24 +03:00
Lauri Ojansivu 320a8ae1ac Repair Veps rule trigger fragments and action labels 2026-09-13 22:49:05 +03:00
Lauri Ojansivu 49d37b087c Record Veps archive and rule translation repair progress 2026-09-13 22:46:49 +03:00
Lauri Ojansivu 627b943788 Repair Veps archive warnings and checklist rule controls 2026-09-13 22:46:23 +03:00
Lauri Ojansivu 1aea1d7f2e Record Veps selection repairs and translation audit progress 2026-09-13 22:44:27 +03:00
Lauri Ojansivu 40f27e1fd0 Repair Veps placement filters and sidebar controls 2026-09-13 22:44:03 +03:00
Lauri Ojansivu 9a8c98c826 Record Veps display repairs and remaining translation work 2026-09-13 22:42:30 +03:00
Lauri Ojansivu 99f4f8f491 Repair Veps display counts and swimlane height validation 2026-09-13 22:42:05 +03:00
Lauri Ojansivu 9e69075fd0 Document mirror progress and timestamped console logs 2026-09-13 22:41:01 +03:00
Lauri Ojansivu 5d1f23c898 Log mirror launcher output to timestamped run directories 2026-09-13 22:40:33 +03:00
Lauri Ojansivu 9e331e4098 Show immediate streaming progress during mirror synchronization 2026-09-13 22:40:10 +03:00
Lauri Ojansivu 982b26c25a Record Veps import repairs and remaining audit work
Update dated source hash and maintained totals to 14,745 corrected, 1,099 pending and 16,535 exact records, with 358 Veps findings remaining. Record mapping and shortcut semantics, passing checks and outstanding broader language validation.

Thanks to xet7 !
2026-09-13 22:35:07 +03:00
Lauri Ojansivu 08a24ea921 Repair Veps import guidance and member shortcuts
Replace 25 Finnish import, invitation, account-state, autocomplete and navigation values. Preserve ZIP attachment directories, CSV/TSV separators, existing-user mapping and the unmapped-member current-user fallback. Correct the assignee shortcut to add/remove assignment while retaining 1-9 and board-addition order. Keep conditional import-error guidance and match WeKan navigation labels while preserving Trello interface literals.

All exact correction records and actual positive/negative rendering checks pass. Composed technical UI wording has low-confidence inflection and needs fluent-speaker review.

Thanks to xet7 !
2026-09-13 22:34:48 +03:00
Lauri Ojansivu 946d1fce7b Record Veps permission repairs and audit progress
Update the dated source commit and maintained totals to 14,723 corrected, 1,121 pending and 16,510 exact records, with 380 Veps findings remaining. Record passive-form refinements, permission fidelity and passing rendering checks; retain broader language validation work.

Thanks to xet7 !
2026-09-13 22:30:37 +03:00
Lauri Ojansivu 834beb172b Repair Veps member permissions and defined participles
Repair/refine 43 role, member, assignee, selection and related UI values: 26 new records and 17 refinements. Preserve read/comment/normal permissions and assigned-only current-user visibility, board/card scopes, add versus assign, all-card removal plus notification and numeric selection ranges. Replace every malformed märitadud occurrence with the reference-confirmed märitud while retaining original before records.

All correction records and actual positive/negative placeholder rendering checks pass. Composed role and UI phrasing has low confidence and needs fluent-speaker review.

Thanks to xet7 !
2026-09-13 22:30:11 +03:00
Lauri Ojansivu cc8db880a4 Record Veps list and checklist repair progress
Update the dated source hash and maintained summaries to 14,705 corrected, 1,139 pending and 16,484 exact records, with 398 Veps findings remaining. Document item-stem refinements and passing actual rendering checks without claiming broader language validation is finished.

Thanks to xet7 !
2026-09-13 22:27:08 +03:00
Lauri Ojansivu 3018d5c4b8 Repair Veps list controls and checklist item inflections
Repair/refine 39 list/card/custom-field/checklist/archive controls: 36 new records and three item-stem refinements preserving original before values. Keep top/bottom and current/selected-list rules distinct, retain checked/all/completed meanings and preserve archive recovery, activity history and irreversible deletion warnings. Match navigation instructions to translated menu/archive headings.

All correction records and positive/negative actual rendering checks pass. Composed kanban wording and UI inflections have low confidence and need fluent-speaker review.

Thanks to xet7 !
2026-09-13 22:26:48 +03:00
Lauri Ojansivu 9c0b9d5e8f Record Veps filter repairs and current translation audit totals
Update the dated source hash, summary and TODO Later to 14,675 corrected, 1,169 pending and 16,448 exact records. Keep 428 Veps findings and broader restored/unflagged and fluent-speaker reviews explicit.

Thanks to xet7 !
2026-09-13 22:22:53 +03:00
Lauri Ojansivu ffd5896916 Repair Veps date filters and due-card view labels
Replace Finnish/Venda filters, countdowns, export date fields, sorting and due-card view text. Repair received-date wording that used the word for a statement and the malformed past deadline adjective. Retain correct Minä. Preserve this/next week, tomorrow, countdown arguments, five export date types and incomplete-card/board-permission conditions.

Actual locale rendering, positive/negative semantics and all correction records pass. Composed UI inflections have low confidence and need fluent-speaker review.

Thanks to xet7 !
2026-09-13 22:22:29 +03:00
Lauri Ojansivu 613a75f41e Refresh TODO Later translation resume status
Correct the remaining Veps count and latest translation source hash. Distinguish the passing 1,015-suite Node run from the later passing date correction/rendering checks.

Thanks to xet7 !
2026-09-13 22:19:44 +03:00
Lauri Ojansivu e8ffcd4357 Update audit progress for Veps date and reminder repairs
Record the dated repair commit and passing correction/rendering checks. Update current totals to 14,670 corrected, 1,174 pending and 16,427 exact records, with 433 Veps findings remaining. Preserve the outstanding restored/unflagged and fluent-speaker reviews.

Thanks to xet7 !
2026-09-13 22:19:19 +03:00
Lauri Ojansivu 9889016d78 Repair Veps date activity and reminder translations
Replace 39 Finnish or mixed Finnish/Venda date controls, rule labels, date activities and reminders with Veps reference vocabulary. Preserve received/start/due/end distinctions, set-or-change rule semantics, old/new time values, exact placeholders and approaching/current/overdue reminder states. Test actual i18next underscore and sprintf argument rendering with negative wrong-language checks.

Composed date and reminder phrasing has low-confidence inflection and needs fluent-speaker review.

Thanks to xet7 !
2026-09-13 22:18:58 +03:00
Lauri Ojansivu 93d1bcb234 Document Meteor 3.6 beta and Rspack 2.2 upgrade
Link the committed toolchain upgrade from Upcoming, record Docker and lockfile consistency and passing Node checks, and retain the pending full Meteor bundle verification. Update the translation audit interruption summary without changing repair counts.

Thanks to xet7 !
2026-09-13 22:16:48 +03:00
Lauri Ojansivu 35082f7d71 Upgrade Meteor to 3.6 beta and Rspack to 2.2
Commit Meteor 3.6-beta.0 release and package pins, the matching Docker Meteor metadata, @meteorjs/rspack 3.0.0-beta.1, Rspack CLI/core/dev-server 2.2 and the explicit SWC compiler. Update the npm lockfile consistently with the development dependencies and pin existing account packages.

All 1,015 Node suites and the parser compilation and version consistency regressions pass. Full Meteor bundle verification remains pending at local tool startup.

Thanks to xet7 !
2026-09-13 22:16:30 +03:00
Lauri Ojansivu 705fe8d461 Record Veps activity label repairs and remaining audit work
Update the dated translation source hash and 16,388 correction record total. Keep the 1,193 pending original findings and 452 Veps findings unchanged because this batch repaired unflagged values. Record passing targeted checks and low-confidence wording review.

Thanks to xet7 !
2026-09-13 22:14:36 +03:00
Lauri Ojansivu 6d8c63866b Repair Veps activity and notification labels
Replace Finnish activity labels with native Veps action and notification vocabulary. Preserve exact before/after records and exercise actual locale rendering with a negative Finnish regression. The composed notification label has low-confidence inflection and needs fluent-speaker review.

Thanks to xet7 !
2026-09-13 22:14:18 +03:00
Lauri Ojansivu 46d6e521dd Record Meteor parser repairs and latest translation upload report
Document the parser source commit, seven runtime/build regressions and 1,015 passing Node suites. Preserve pending full Meteor bundle verification and translation repair counts. Record the latest maintainer-run upload report with 237 successes, five unsupported codes and an informational catalogue list.

Thanks to xet7 !
2026-09-13 22:13:14 +03:00
Lauri Ojansivu 6cd1938799 Use Meteor Express parsers for Rspack 2 builds
Remove the undeclared body-parser import while preserving JSON and URL-encoded parsing, the 50MB limit and simple form decoding. Exercise real HTTP requests, malformed and oversized JSON, compression and Rspack compilation. Permit the canonical Meteor prerelease in the website manifest regression while rejecting stale Docker metadata.

Thanks to xet7 !
2026-09-13 22:11:23 +03:00
Lauri Ojansivu bdea2a0ed1 Record Veps activity and grammar repair progress
Update dated Audit and Upcoming with source commit, attested added participle refinements, 14,651 corrected findings, 1,193 pending and 16,386 exact correction records. Refresh TODO Later and retain remaining translation review status.

Thanks to xet7 !
2026-09-13 22:04:07 +03:00
Lauri Ojansivu ad1ebcca99 Repair Veps checklist activity and added participles
Repair thirty-two values: twenty-three new correction records and nine refinements preserving original before values. Resolve sixteen original findings. Translate checklist/custom-field/comment activities and rule triggers, correcting all ližadud occurrences to dictionary/inflection-table and native MediaWiki ližatud. Preserve checkbox versus completion, reopening, add/remove context and field clearing versus deletion. Exact correction, underscore and sprintf argument-order regressions pass. Low confidence: composed kanban terminology and remaining UI inflections need fluent review.

Thanks to xet7 !
2026-09-13 22:03:31 +03:00
Lauri Ojansivu 4654c660d7 Record Veps custom field translation progress
Update dated Audit and Upcoming with the source commit, verified literal placeholders/entities, 14,635 corrected original findings, 1,209 pending and 16,363 exact correction records. Refresh TODO Later and retain outstanding fluent/restored-value review status.

Thanks to xet7 !
2026-09-13 22:01:04 +03:00
Lauri Ojansivu f244017394 Repair Veps custom field labels and template help
Replace twenty-three Finnish/Venda values with dictionary-backed Veps, resolving ten original findings. Preserve field types, multi-select, value/activity contexts and all-card irreversible deletion with history loss. Restore literal %{value}, preserve HTML space entities, and make generic/custom-field date labels consistent. Exact corrections, actual i18next interpolation, source tokens, entities and key order pass. Low confidence: composed custom-field/control terminology and UI inflections need fluent review.

Thanks to xet7 !
2026-09-13 22:00:43 +03:00
Lauri Ojansivu 8f2a8a3cf0 Record Veps checklist repair progress in Upcoming
Update the dated audit and source commit, Upcoming summary and TODO Later counts: 14,625 corrected findings, 1,219 pending and 16,340 exact correction records. Record passing targeted checks and remaining fluent/restored-value reviews.

Thanks to xet7 !
2026-09-13 21:58:27 +03:00
Lauri Ojansivu 9955ad8166 Repair Veps checklist controls and activity messages
Replace twenty-one Finnish, Venda and mixed values using dictionary and native MediaWiki evidence, resolving ten original findings. Preserve add/remove, check/uncheck, completion/reopening, subtask and board context, exact __checkList__ case, and (0/0) counters. Exact corrections, actual i18next interpolation, tokens and key order pass. Low confidence: composed kanban checklist/subtask terminology and UI inflection require fluent review.

Thanks to xet7 !
2026-09-13 21:58:04 +03:00
Lauri Ojansivu 534ef85aa0 Record Veps activity translation repairs in Upcoming
Update dated Audit and Upcoming with the source commit, thirty-two repairs, passing interpolation and correction regressions, 14,615 corrected findings, 1,229 pending and 16,319 correction records. Refresh TODO Later and preserve outstanding fluent/restored-value review status.

Thanks to xet7 !
2026-09-13 21:56:10 +03:00
Lauri Ojansivu 5ff1e475d7 Repair Veps card and activity notification translations
Repair thirty-two values with dictionary-backed Veps, resolving twenty-two original findings. Preserve labels, attachments, comments, membership, archiving, imports, restoration and card move contexts/source destinations. Compose the swimlane metaphor from attested ujund and šoid and repair the unsupported seeded stem in deletion messages. Verify actual i18next rendering with production underscore interpolation, aliases, exact corrections, tokens and key order. Low confidence: kanban metaphors, compounds and UI inflections require fluent review.

Thanks to xet7 !
2026-09-13 21:55:47 +03:00
Lauri Ojansivu 3026212983 Record Veps migration settings repair progress
Update the dated audit, source commit, Upcoming entry and TODO Later counts: 14,593 corrected findings, 1,251 pending and 16,287 exact correction records. Record passing targeted checks and remaining fluent/restored-value reviews.

Thanks to xet7 !
2026-09-13 21:53:21 +03:00
Lauri Ojansivu 0cef80395e Repair Veps migration limits and log translations
Replace ten Finnish settings values with Veps using dictionary and native MediaWiki evidence. Preserve attachment batch counts, CPU percentage pause threshold, millisecond delay and all numeric ranges. Add actual i18next rendering and negative wrong-language/range regression checks. All 16,287 correction records verify. Low confidence: technical batch terminology, millisecond inflection and composed UI grammar require fluent review.

Thanks to xet7 !
2026-09-13 21:53:00 +03:00
Lauri Ojansivu a297ff7fe1 Update Upcoming and audit with Veps migration repairs
Record the dated source commit, passing translation/rendering and changelog checks, 14,590 corrected findings, 1,254 pending and 16,277 exact correction records. Refresh stale TODO Later counts and identify the remaining Veps and Standard Moroccan Tamazight queues. Fluent and restored-value reviews remain outstanding.

Thanks to xet7 !
2026-09-13 21:51:41 +03:00
Lauri Ojansivu de29190132 Repair Veps migration controls and status translations
Replace fifteen Finnish values using Veps dictionary and native MediaWiki evidence. Preserve all-migration scope, pause versus stop, start versus resume, completion and failure outcomes. Use the existing migracii technical term rather than physical file transfer. Low confidence: loan inflection and composed UI grammar need fluent review. Exact corrections, actual i18next rendering, placeholders, JSON examples and key order pass regression checks.

Thanks to xet7 !
2026-09-13 21:51:02 +03:00
Lauri Ojansivu be43151017 Record Veps S3 translation repair progress
Update the dated audit, source commit and Upcoming summary: 14,583 corrected original findings, 1,261 pending and 16,262 exact correction records. Record remaining fluent-review work and passing regression checks.

Thanks to xet7 !
2026-09-13 21:49:35 +03:00
Lauri Ojansivu 113208d773 Repair Veps S3 credential and connection translations
Replace eleven Finnish values with dictionary-backed Veps. Distinguish access keys from secret keys, successful and failed connections, object-storage bucket names and MongoDB GridFS storage. Preserve endpoint URL examples. Low confidence: composed authentication terminology, technical loans and inflection need fluent review. Exact corrections and actual i18next rendering regressions pass, alongside source token and key-order checks.

Thanks to xet7 !
2026-09-13 21:49:10 +03:00
Lauri Ojansivu c03f2c687e Record resumed Veps network translation repairs and audit progress
Thanks to xet7.
2026-09-13 21:45:56 +03:00
Lauri Ojansivu 5cf370063b Repair Veps SMTP and S3 network settings translations
Replace 18 Finnish labels and descriptions, resolving seven original findings. Preserve protocol identifiers, secret credentials, literal region codes and storage distinctions; repair STMP to SMTP. Use reviewed dictionary and native MediaWiki terminology. Network loan words and composed authentication/UI grammar remain low confidence for fluent review. Exact token, key-order, ledger and actual i18next rendering regressions pass.

Thanks to xet7.
2026-09-13 21:45:34 +03:00
Lauri Ojansivu c396860b7b Record organization mirror changes and verification in Upcoming
Link the implementation commit from Upcoming and record organization namespaces, static comment archives, enabled wiki/project handling and shared rate-limit behavior. Keep translation repair counts unchanged and record the mirror interruption outcome and remaining WebKit environment limitation.

Thanks to xet7.
2026-09-13 21:43:51 +03:00
Lauri Ojansivu 02383540a5 Mirror configured organizations with linked files and offline indexes
Add organization management and per-destination namespaces to the shared Unix and Windows mirror menu. Discover all accessible repositories, create missing mirrors, retain PR conversations when issues are disabled, and copy enabled wiki history and portable Projects V2 data.

Archive linked media, files and webpage HTML per comment under host/organization/repository directories. Preserve old versions, generate static HTML and CSV catalogues, and support offline rebuilding from CSV. Attach archived files to corresponding destination comments where supported.

Honor GitHub and destination rate-limit headers, persistent cooldowns and bounded retries. Public GitHub REST reads fall back without a token. Add offline regressions and a static browser test; 1,014 Node suites pass, with final targeted checks passing. Chromium and Firefox static checks pass; local WebKit requires unavailable ICU 74.

Thanks to xet7.
2026-09-13 21:43:19 +03:00
Lauri Ojansivu 1e3552a1f8 Record Veps attachment repairs and current translation audit counts
Record the dated local source commit, twenty repairs and tested destination/deletion distinctions in the short audit summary and upcoming changelog. Update TODO Later to 14,574 corrected original findings, 1,270 pending and 16,233 correction records. Keep low-confidence language and restored-value reviews outstanding. Correction, audit-progress and changelog regressions pass.

Thanks to xet7 !
2026-09-13 21:02:05 +03:00
Lauri Ojansivu dbf214bda2 Repair Veps attachment storage, migration and permanent deletion messages
Replace twenty Finnish values with Veps backed by the Russian–Veps dictionary and native MediaWiki terminology. Preserve filesystem, MongoDB GridFS and S3 destinations, single-versus-all attachment scope, AWS/MinIO identifiers, save success/failure and permanent deletion with no undo. Use native Sirdä for moving files, distinct from navigation Sirte. Exact correction, placeholder, key-order and actual i18next rendering regressions pass. Low confidence: composed filesystem terminology, base-path compound päte, attachment participle and technical UI grammar need fluent review.

Thanks to xet7 !
2026-09-13 21:01:40 +03:00
Lauri Ojansivu 1e82c54ee6 Record resumed Veps list repairs and current translation audit progress
Record the dated source commit and verified list-control repairs in the short translation audit and upcoming changelog. Update TODO Later to 14,555 corrected original findings, 1,289 pending and 16,213 exact correction records. Preserve the outstanding restored-value and fluent-language review scope. Correction, progress and changelog format regressions pass.

Thanks to xet7 !
2026-09-13 20:59:38 +03:00
Lauri Ojansivu 198f7a0f56 Repair Veps list position, sorting and duplicate cleanup controls
Replace twelve Finnish list-control values with Veps vocabulary checked against the Russian–Veps dictionary and native MediaWiki translations. Preserve selected-list left/right positions and distinguish empty-only duplicate cleanup from all duplicate cleanup. Exact correction, placeholder, key-order and actual i18next rendering regressions pass. Low confidence: composed UI grammar and the derived plural genitive lugetišiden need fluent review.

Thanks to xet7 !
2026-09-13 20:59:08 +03:00
Lauri Ojansivu 22ce54de6d Use descriptive links for mirror follow-up changes in the changelog
Keep commit hashes in link targets and show readable attachment and retry descriptions in the upcoming release. Changelog format regressions pass.

Thanks to xet7 !
2026-09-13 20:56:53 +03:00
Lauri Ojansivu 1717fe13d3 Record mirror menu changes and passing Node verification
Document the six-action saved mirror menu, selectable sources, native attachment links and archive retry behavior in the upcoming changelog. Record 1,011 passing Node suites and keep the translation audit summary current at 14,545 corrected findings, 1,299 pending findings and 16,201 correction records. Translation repairs are ready to continue after the mirror work.

Thanks to xet7 !
2026-09-13 20:56:44 +03:00
Lauri Ojansivu 63f41589d8 Continue mirror destinations after reporting local archive failures
Preserve the existing launcher retry behavior: failed source inventory stops synchronization, but a local archive failure records an overall failure and still attempts supported data on every selected destination. Extend the injected-command regression to verify all targets run without live remote writes.

Thanks to xet7 !
2026-09-13 20:56:19 +03:00
Lauri Ojansivu 083a28c4f3 Preserve native attachment links when selecting a different mirror source
Resolve relative GitLab, Codeberg and SourceForge attachment paths against the original forge in destination text and persistent archive discovery. Recognize current GitLab project upload URLs, preserve original JSON metadata and exclude arbitrary websites from downloads. Offline link and archive regressions pass.

Thanks to xet7 !
2026-09-13 20:55:44 +03:00
Lauri Ojansivu 675ca5d954 Add saved mirror menu, configurable sources and read-only checks
Default to GitHub as source and GitLab, Codeberg and SourceForge as mirrors. Share the six-action menu across Unix and Windows, save source and active destinations in .tools/mirror/settings.txt, and delegate synchronization to individual forge launchers. Support native source inventories and GitHub destinations, preserve original provenance and isolate source archives. Compare Git ancestry and inventory missing metadata without remote writes in check mode. Verify menu interaction, adapters, retries, settings validation and archive isolation with offline fixtures.

Thanks to xet7 !
2026-09-13 20:54:13 +03:00
Lauri Ojansivu b575e7f4e9 Record Veps activity repair progress before mirror menu work
Update dated translation source commit and verified correction counts; preserve outstanding low-confidence and restored-value validation.

Thanks to xet7 !
2026-09-13 20:39:53 +03:00
Lauri Ojansivu ba375ac7d6 Repair Veps activity messages and list, label and attachment terminology
Replace 27 Finnish activity and core labels using native Veps dictionary vocabulary. Preserve placeholder order and source/destination roles and verify real i18next sprintf rendering. Low confidence: composed kanban grammar, derived participles and list plural need fluent review.

Thanks to xet7 !
2026-09-13 20:39:14 +03:00
Lauri Ojansivu f1a05859f6 Record checked Veps calendar vocabulary and audit progress
Document dated local calendar fix commits, native dictionary sources and verified page references. Refresh totals to 14533 corrected original findings, 1311 pending and 16174 exact repairs. Explicitly retain low-confidence technical composition and Coptic-name review, restored translation validation and browser work.

Thanks to xet7 !
2026-09-13 20:35:45 +03:00
Lauri Ojansivu b7eca83d98 Use attested Veps time-reckoning and lunar terms in calendar labels
Refine the new Hijri labels from the complete dictionary: describe the epoch as aiganlugun augotiž, the origin of time reckoning, and use the genitive of kudmaine for moon observation. Correct the vocabulary provenance in the existing four repair records. Preserve distinct civil and astronomical variants and mark composed technical wording for fluent review.

Thanks to xet7 !
2026-09-13 20:34:50 +03:00
Lauri Ojansivu c6204ffd4f Translate remaining Veps Coptic and Hijri calendar labels
Replace English labels with Veps, retaining tabular civil and astronomical epoch distinctions and Saudi lunar observation. Use native vocabulary from the 2007 Zaiceva/Mullonen Russian-Veps dictionary and the Veps Saudi Arabia article. Record four exact repairs and add positive terminology and negative English/variant-collision regressions.

Low confidence: composed technical labels, the epoch-origin phrasing and adapted Coptic proper name need fluent Veps review.

Thanks to xet7 !
2026-09-13 20:33:50 +03:00
Lauri Ojansivu c155dc0392 Update translation audit after Veps account-message repairs
Record the 2026-09-13 source commit, native vocabulary evidence and low-confidence composed wording. Refresh original finding counts to 14529 corrected and 1315 pending, with 16170 exact corrections. Distinguish the latest targeted checks from the preceding full Node run.

Thanks to xet7 !
2026-09-13 20:29:20 +03:00
Lauri Ojansivu 6d071f6cb8 Repair Veps username minimum and SMTP test action
Replace Finnish username-length and self-addressed test-email strings using attested native Veps vocabulary. Preserve the inclusive minimum of three characters and the personal recipient. Also replace the Finnish text noun with native Veps Tekst. Record exact corrections and add vocabulary and minimum-boundary regressions.

Low confidence: composed username warning and test-email compound need fluent Veps review. Vocabulary source: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/vep.json

Thanks to xet7 !
2026-09-13 20:28:44 +03:00
Lauri Ojansivu 2192a8be8f Record mirror archiving and translation repair verification
Document per-target mirror synchronization, persistent issue/pull/release file retention and the Veps export-title repair with source commit references. Refresh the translation correction count and latest local fix. Record 1010 passing Node suites and preserve the outstanding Chromium board-export and language review work.

Thanks to xet7 !
2026-09-13 20:26:34 +03:00
Lauri Ojansivu e2338530cb Archive mirror issue, pull request and release files without deletion
Keep complete source files under .tools/mirror/issues/<number>, pulls/<number> and releases/<version>. Persist metadata, comments, reviews, patches, GitHub-hosted attachments, binaries and source archives. Rename removed or changed versions with old-YYYY-MM-DD_HH-MM-SS prefixes; preserve existing copies on download failures and retry on later runs.

Archive once before per-target synchronization, reuse verified release files and guard concurrent archive writers. Preserve destination main commits through the existing merge fallback without force or ref deletion. Exclude disabled GitHub Discussions, projects and wiki. Document the design and verify retention, retries, API pagination and launcher behavior with offline fixtures.

Thanks to xet7 !
2026-09-13 20:25:17 +03:00
Lauri Ojansivu a574de0e1a Repair the Veps chart export popup title
Replace an unflagged Zulu-seeded title with native Veps Ve, matching the repaired export command and MediaWiki export terminology. Record the exact correction and extend the chart-title regression. This resolves the remaining failure found by the full Node suite run.
2026-09-13 20:05:29 +03:00
Lauri Ojansivu b1983adbb6 Synchronize missing GitHub data to active WeKan mirrors
Repair Tools menu dispatch and run separate GitLab, Codeberg and SourceForge launchers through a shared engine on Unix and Windows. Read one paginated GitHub snapshot for all mirrors, match issue/comment provenance and release tags, and retry missing conversations and binary assets after partial runs. Preserve destination text and copy Git branches/tags without force or deletions. SourceForge uses Tracker tickets and SFTP release files; projects and wiki are excluded. Add offline API, retry, pagination, multipart upload and launcher regressions plus setup/scope documentation.
2026-09-13 20:05:29 +03:00
Lauri Ojansivu afa0b550c5 Update audit progress for Veps account email repairs 2026-09-13 19:44:38 +03:00
Lauri Ojansivu 88220b7a04 Repair foreign Veps account and SMTP email messages
Replace Finnish/Venda account creation, password reset, address verification, email invitation action and SMTP success text. Preserve site tokens and the addressed user. Native software/dictionary vocabulary checked; low confidence: composed subject and success grammar requires fluent review. Invitation subject noun remains under investigation.

Thanks to xet7 !
2026-09-13 19:44:25 +03:00
Lauri Ojansivu 78b73f781d Record Veps avatar translation fixes and remaining reviews 2026-09-13 19:43:00 +03:00
Lauri Ojansivu 96b75531ab Repair Finnish Veps avatar controls and size warnings
Compose native user-image wording for avatar change/delete/upload states, allowed types and maximum sizes. Preserve the size placeholder, byte unit and deletion confirmation. Low confidence: composed avatar phrasing and byte-unit inflection require fluent review.

Thanks to xet7 !
2026-09-13 19:42:45 +03:00
Lauri Ojansivu d215230737 Record cross-platform mirror tooling and SourceForge changes 2026-09-13 19:41:41 +03:00
Lauri Ojansivu e8be344041 Install complete tooling for active mirrors across platforms
Install Git, SSH/SCP/SFTP, curl, jq, Node and Go prerequisites with native Debian/Ubuntu, Fedora, Brew and Windows package mappings. Use native Go builds for missing forge CLIs, verified current Go archive bootstrap for older Unix toolchains, repository-local binaries and refreshed PATH. Report remaining missing tools and failure status without stopping later attempts. Add SourceForge to the Windows mirror targets. Offline Unix, PowerShell, architecture, checksum and menu regressions pass; no remote mirroring, uploads or publishing ran.

Thanks to xet7 !
2026-09-13 19:41:25 +03:00
Lauri Ojansivu 963539e955 Update translation audit for Veps email and status repairs 2026-09-13 19:33:55 +03:00
Lauri Ojansivu 812c2437a2 Repair Finnish Veps email and active status controls
Use native Veps software vocabulary for email addresses, send/sent/error states and active/inactive filters. Restore the plural address label, retain SMTP and preserve opposing states. Low confidence: composed SMTP test subject needs fluent review.

Thanks to xet7 !
2026-09-13 19:33:41 +03:00
Lauri Ojansivu a3588fa706 Document Forge and Tea installer fixes in upcoming changelog 2026-09-13 19:32:44 +03:00
Lauri Ojansivu 23eda3ea3a Fix Forge CLI installation and use maintained Tea module
Install Forge from cmd/forge instead of its library root and Tea from gitea.dev/tea instead of the obsolete code.gitea.io module. Apply paths on Unix and Windows. Report Unix Tea/Forge Go failures with nonzero status while continuing later tools. Offline regression covers Fedora detection, skips, paths and failure continuation; no packages or remote writes ran.

Thanks to xet7 !
2026-09-13 19:32:33 +03:00
Lauri Ojansivu baa958b871 Record Veps upload translation repairs and confidence limits 2026-09-13 19:30:54 +03:00
Lauri Ojansivu 22e513df92 Repair Finnish Veps upload and email status labels
Use native software vocabulary for ongoing uploads, failure, completion and upload limits. Preserve bytes and allowed file types. Low confidence: composed type and byte-unit inflections need fluent review.

Thanks to xet7 !
2026-09-13 19:30:41 +03:00
Lauri Ojansivu 53eb604ae9 Record Veps permission translation repairs and remaining reviews 2026-09-13 19:29:50 +03:00
Lauri Ojansivu e6b39cc685 Repair Veps rename permissions and filter controls
Replace seven Finnish labels using native software terminology and dictionary forms. Preserve Username Change source meaning, permission actions and clearing all filters. Low confidence: composed permission and no-errors grammar needs fluent review.

Thanks to xet7 !
2026-09-13 19:29:38 +03:00
Lauri Ojansivu fd5cfc4294 Update audit progress for Veps action translation repairs 2026-09-13 19:28:29 +03:00
Lauri Ojansivu 22c70a8537 Repair foreign Veps change, close and import/export actions
Use attested native Veps software commands, including rename. Preserve distinct import/export and close/delete actions with vocabulary and rejected seed regression coverage.

Thanks to xet7 !
2026-09-13 19:28:16 +03:00
Lauri Ojansivu e14d1dbbf8 Record Transifex missing-language retry verification 2026-09-13 19:27:19 +03:00
Lauri Ojansivu ad294f7073 Verify retries when Transifex adds missing language support
Exercise all five unsupported language codes across failed registration, newly supported registration with full uploads, and subsequent uploads without duplicate additions. Document fresh project discovery, no persisted failure skip list, and mapping changes when catalogue codes differ.

Thanks to xet7 !
2026-09-13 19:27:09 +03:00
Lauri Ojansivu 05d8e5e383 Record Veps navigation translation repairs and verification 2026-09-13 19:26:42 +03:00
Lauri Ojansivu a14b0ffc47 Repair Finnish labels in Veps navigation and errors
Use native MediaWiki Veps labels for Back, Done, Error, Version and Create. Verify the distinct plural errors label against Veps dictionary declension. Preserve placeholders and existing correct labels.

Thanks to xet7 !
2026-09-13 19:26:22 +03:00
Lauri Ojansivu d50cd10de6 Record dated Veps interval translation repairs and confidence limits 2026-09-13 19:22:34 +03:00
Lauri Ojansivu 47150ef05c Replace Finnish Veps recurring interval labels with reviewed vocabulary 2026-09-13 19:22:21 +03:00
Lauri Ojansivu d35221afee Record dated Veps time unit translation repairs 2026-09-13 19:21:19 +03:00
Lauri Ojansivu c938208a87 Repair Veps time units and lockout duration label 2026-09-13 19:20:58 +03:00
Lauri Ojansivu 76e09f2d25 Record dated Veps notification translation repairs 2026-09-13 19:19:48 +03:00
Lauri Ojansivu 45045afae2 Repair Veps notification deletion and description labels 2026-09-13 19:19:33 +03:00
Lauri Ojansivu 7c1270f755 Record dated Veps navigation and file translation repairs 2026-09-13 19:18:36 +03:00
Lauri Ojansivu 5f011f2197 Repair Veps navigation and file control labels 2026-09-13 19:18:21 +03:00
Lauri Ojansivu 0cdd509553 Record dated Veps authentication vocabulary repairs 2026-09-13 19:17:38 +03:00
Lauri Ojansivu ab9562badb Repair Veps authentication email and confirmation labels 2026-09-13 19:17:25 +03:00
Lauri Ojansivu f03b76e4df Record dated Veps unlock prompt translation repairs 2026-09-13 19:16:40 +03:00
Lauri Ojansivu 03773df046 Repair Veps unlock confirmation prompts and unlock all action 2026-09-13 19:16:24 +03:00
Lauri Ojansivu d13a092327 Record dated Veps lockout translation repairs and pending reviews 2026-09-13 19:15:41 +03:00
Lauri Ojansivu 90b6e57bb6 Repair Veps known unknown and locked user messages 2026-09-13 19:15:01 +03:00
Lauri Ojansivu c1da9053ef Record dated Veps account translation repairs and review limits 2026-09-13 19:13:49 +03:00
Lauri Ojansivu 1ca7941c2d Repair Veps password forms and account messages 2026-09-13 19:13:33 +03:00
Lauri Ojansivu 242a47df89 Record dated Veps core vocabulary repairs and audit progress 2026-09-13 19:12:40 +03:00
Lauri Ojansivu 29ee41f458 Repair Veps settings password and core action labels 2026-09-13 19:12:27 +03:00
Lauri Ojansivu ae988365a1 Record dated Veps year warning repair and confidence limits 2026-09-13 19:11:04 +03:00
Lauri Ojansivu 247ae2a9a2 Replace Zulu Veps year warning with low confidence native composition 2026-09-13 19:10:51 +03:00
Lauri Ojansivu d60d874ae1 Record dated Veps date repairs and inspected Transifex upload report 2026-09-13 19:09:48 +03:00
Lauri Ojansivu 8b01dc1360 Repair Veps date format labels and invalid time warning 2026-09-13 19:09:27 +03:00
Lauri Ojansivu b883049244 Record dated Veps national calendar translation repairs 2026-09-13 19:08:28 +03:00
Lauri Ojansivu aca7cfe2c5 Repair Veps Indian national and Minguo calendar labels 2026-09-13 19:08:11 +03:00
Lauri Ojansivu 7a160a4245 Record dated Veps Buddhist and Hijri translation progress 2026-09-13 19:07:26 +03:00
Lauri Ojansivu d26e32c147 Repair Veps Buddhist and named Hijri calendar labels 2026-09-13 19:07:12 +03:00
Lauri Ojansivu 015a7c2e50 Record dated Veps Hebrew and Amete Alem repairs 2026-09-13 19:06:26 +03:00
Lauri Ojansivu c522b5653d Repair Veps Hebrew and Amete Alem calendar labels 2026-09-13 19:06:12 +03:00
Lauri Ojansivu 4cb4756c63 Record dated Veps command repairs and ongoing translation audit 2026-09-13 19:05:12 +03:00
Lauri Ojansivu 0f3be94581 Repair Veps search and edit commands 2026-09-13 19:05:00 +03:00
Lauri Ojansivu 82b533a849 Record dated Veps calendar translation repairs and remaining audit work 2026-09-13 19:03:37 +03:00
Lauri Ojansivu 94b5e33efe Repair Veps Ethiopic and Dangi calendar labels 2026-09-13 19:03:22 +03:00
Lauri Ojansivu f6fc0024df Record dated Veps repairs and partial Transifex rerun status 2026-09-13 19:02:11 +03:00
Lauri Ojansivu d75133d578 Repair Veps color year and calendar event name labels 2026-09-13 19:01:51 +03:00
Lauri Ojansivu bea22eec49 Record successful Guarani upload and continuing Manx catalogue failure 2026-09-13 19:00:34 +03:00
Lauri Ojansivu e2366efd66 Record dated Tamazight calendar name repair progress 2026-09-13 18:57:07 +03:00
Lauri Ojansivu 70714dce45 Repair Tamazight Islamic Chinese and Japanese calendar names
Use attested native calendar and country vocabulary instead of English seeds. Exact Islamic name follows Unicode CLDR; composed Chinese and Japanese names need fluent review. Positive and distinct-calendar regressions pass with full correction ledger.
2026-09-13 18:56:53 +03:00
Lauri Ojansivu 396f11d653 Record dated Tamazight date vocabulary repairs 2026-09-13 18:55:59 +03:00
Lauri Ojansivu 0f53712473 Repair Arabic and French Tamazight date interface labels
Use Unicode CLDR native Tifinagh vocabulary for Calendar, Time, Today, Day, Week and Month. Preserve existing correct calendar values and verify exact vocabulary and script in the full correction ledger.
2026-09-13 18:55:46 +03:00
Lauri Ojansivu 4ebdc4196f Record dated Tamazight core label repairs and broader review scope 2026-09-13 18:55:02 +03:00
Lauri Ojansivu 56c02baca5 Replace Arabic Tamazight title and language labels with native Tifinagh
Use IRCAM-attested Standard Moroccan Tamazight labels for Title and Language. Preserve correct-language translations elsewhere and add positive vocabulary and negative Arabic-script checks.
2026-09-13 18:54:49 +03:00
Lauri Ojansivu 41bc69317d Record dated Veps diagnostic repairs and pending audit work 2026-09-13 18:53:54 +03:00
Lauri Ojansivu 389dc28e5a Repair Veps user and board not-found diagnostics
Replace Finnish seeded diagnostics with attested Veps user, name, board and passive find vocabulary. Preserve quoted format placeholders. Composed technical wording needs fluent review; exact correction and positive/negative vocabulary tests pass.
2026-09-13 18:53:39 +03:00
Lauri Ojansivu 3af563612e Update dated Veps organization repair progress 2026-09-13 18:53:03 +03:00
Lauri Ojansivu 42f9317348 Repair Finnish organization labels in Veps
Use dictionary-attested organization noun sebr, plural sebrad, genitive plural sebroiden and passive löutud. Preserve diagnostic placeholders and record exact corrections. Composed diagnostic wording needs fluent review; vocabulary and token regression checks pass.
2026-09-13 18:52:51 +03:00
Lauri Ojansivu d2ab907c53 Record dated Sakha and Veps calendar repair progress 2026-09-13 18:51:47 +03:00
Lauri Ojansivu 70bf60d308 Repair Sakha and Veps Persian and Coptic calendar labels
Use attested native Persian and Coptic names with existing calendar vocabulary, retaining Jalali as a proper name. Composed calendar names need fluent review. Positive and negative vocabulary checks pass with exact correction provenance.
2026-09-13 18:51:33 +03:00
Lauri Ojansivu 72e98efe55 Record dated Kashmiri calendar correction and remaining findings 2026-09-13 18:50:25 +03:00
Lauri Ojansivu 48e6eef90a Use attested Kashmiri civil calendar display name
Replace English Islamic civil with the localized Unicode CLDR Kashmiri name. Check exact native vocabulary and that the civil variant remains distinct from the general Hijri calendar. Other two Kashmiri Hijri findings remain pending.
2026-09-13 18:50:13 +03:00
Lauri Ojansivu b0086a7d80 Record Tibetan calendar repair date and remaining audit work 2026-09-13 18:49:28 +03:00
Lauri Ojansivu 3d8f207336 Repair Tibetan calendar names and distinguish Hijri variants
Replace English and Italian calendar seeds with Tibetan labels, preserving Jalali, Hijri and ISO identifiers. Distinguish tabular epochs and lunar sighting with dictionary-supported vocabulary. Technical compositions and transliterations have low confidence and need fluent review. Correction tests pass; Member Settings UI coverage is added and syntax-checked, browser execution pending.
2026-09-13 18:48:52 +03:00
Lauri Ojansivu 711dbe5143 Record upload support reporting and maintainer supplied run outcome 2026-09-13 18:47:35 +03:00
Lauri Ojansivu 637dbebd66 Report translation upload outcomes and Transifex language support
List successful uploads, failures with reasons, supported retry targets, unsupported local codes and additional catalogue targets requiring local translations. Inspect paginated catalogue read-only, distinguish unavailable support checks, and document requests for new global languages. Verify all reporting offline.
2026-09-13 18:47:22 +03:00
Lauri Ojansivu 5e5e562822 Record dated Veps label repairs and remaining audit counts 2026-09-13 18:45:40 +03:00
Lauri Ojansivu a98ae04742 Replace Finnish Veps alphabetical title sorting label
Use attested native words Nimi and kirjamišt. Compact parenthetical sorting wording has low confidence and needs fluent review. Add exact correction and vocabulary checks.
2026-09-13 18:45:13 +03:00
Lauri Ojansivu d656d86c06 Repair Veps field labels and board action imperative
Use native Kelʹ, Lugu and Nimi instead of Finnish seed labels. Correct Painda to the dictionary imperative Paina in existing default-board instructions. Preserve exact correction provenance and add vocabulary regression checks.
2026-09-13 18:44:29 +03:00
Lauri Ojansivu e2ef0449a0 Update dated translation repair progress and Chinese upload notes 2026-09-13 18:43:45 +03:00
Lauri Ojansivu b9f5fbb928 Repair Finnish seed text in Veps time and basic interface labels
Use dictionary-attested Aig, Uzʹ and Tämbei for Time, New and Today. Preserve source keys and record exact corrections with positive and negative vocabulary checks.
2026-09-13 18:43:30 +03:00
Lauri Ojansivu c2a9168c46 Use supported hyphenated Chinese script code for Transifex
Map zh-Hans to zh-Hans rather than invalid zh_Hans. Verify mapping and loader round trips offline and document unsupported Wolaytta registration.
2026-09-13 18:43:13 +03:00
Lauri Ojansivu 71794dabc4 Record translation status logging and completed test run results 2026-09-13 18:41:59 +03:00
Lauri Ojansivu 196c0addcf Save translation upload terminal status to timestamped logs
Mirror stdout and stderr to local-time status logs, including dry runs and failures, while preserving exit status. Document unsupported Tigre registration and verify logging offline.
2026-09-13 18:41:45 +03:00
Lauri Ojansivu f8c55e91b2 Record browser startup verification and remaining Uzbek Arabic review
Document 37ae64fa8, passing actual startup tests and pending browser execution. Keep the newly observed Uzbek Arabic script issue in the audit. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:37:56 +03:00
Lauri Ojansivu 37ae64fa8c Complete Cantonese Wu and Macau browser language fallbacks
Resolve yue and wuu to their existing registered variants, and zh-MO to Traditional Chinese. Exercise actual startup autoruns, delayed profile preference, browser languagechange and absence of profile writes. Browser-language checks pass. Arabic Uzbek vocabulary/script remains a separate translation review.

Thanks to xet7 !
2026-09-13 18:37:41 +03:00
Lauri Ojansivu 57651f1281 Record Russian upload mapping repair in dated audit and Upcoming
Document e6aed7a8c, passing offline checks and unsupported Aromanian catalogue status. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:36:47 +03:00
Lauri Ojansivu e6aed7a8cd Fix Russian Russia Transifex upload mapping
Map ru-RU to supported ru_RU and report its file alias instead of uploading twice. Keep unsupported Aromanian failures visible rather than mapping to Romanian. Offline upload and loader tests pass; no uploads were run.

Thanks to xet7 !
2026-09-13 18:36:34 +03:00
Lauri Ojansivu 8a666b646b Document browser locale fallback and correct browser test fixture identity
Record 1666a2012 and 0c0adb48b, saved preference precedence and pending UI execution. Use the existing fixture user.id in browser coverage. Locale, audit-progress, changelog-format and browser syntax checks pass.

Thanks to xet7 !
2026-09-13 18:36:08 +03:00
Lauri Ojansivu 1666a2012b Resolve ordered browser languages when no profile language is saved
Match all browser preferences using existing locale identifiers and explicit standard-to-legacy aliases, including Veps, Venetian, Latin American Spanish and Uzbek scripts. Prefer supported saved profile choices and fall back to English. Respond to browser languagechange without writing a profile choice. Checks cover all 245 locales and alias/error cases. Browser regression added and syntax-checked; execution pending.

Thanks to xet7 !
2026-09-13 18:35:42 +03:00
Lauri Ojansivu 0c0adb48b9 Fix Portuguese Portugal upload code and document local alias boundaries
Map pt-PT to pt_PT and upload the shared target once. Verify that canonical alias targets are registered and loaded while retaining local variant wording. Offline upload and language-loader checks pass; no uploads were run.

Thanks to xet7 !
2026-09-13 18:35:42 +03:00
Lauri Ojansivu 38e7cf81a4 Record dated Acehnese credential repairs and uncertain vocabulary reviews
Document c6e76522d and 16,007 exact correction records, preserving unresolved language reviews. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:33:56 +03:00
Lauri Ojansivu c6e76522d1 Repair Acehnese service-account wording in GCS credentials controls
Replace Indonesian layanan with attested Acehnese peulayanan in the remaining flagged label and two related instructions. Preserve literal Google Cloud menu labels and JSON. Composed technical wording is low confidence; wider mixed-language review remains. Positive and negative correction checks pass.

Thanks to xet7 !
2026-09-13 18:33:44 +03:00
Lauri Ojansivu b1a4cd5059 Document language popup flags upload repairs and dated audit progress
Record 8549b6c4c, cb6830505 and d5363a26b, passing local checks and pending browser verification. Preserve remaining translation findings. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:32:17 +03:00
Lauri Ojansivu 8549b6c4c6 Show country and language flags for every regional popup locale
Verify all 245 registered popup locales and every translation file. Resolve regional flags from base languages with explicit legacy and script exceptions; preserve country-before-language order in RTL interfaces. Unit wiring and actual-helper checks pass. Add and syntax-check browser coverage; browser execution remains pending.

Thanks to xet7 !
2026-09-13 18:31:56 +03:00
Lauri Ojansivu cb68305053 Fix French Khmer and Guarani Transifex language identifiers
Use supported fr_BE, fr_CA, km_KH and gug_PY codes. Collapse the Khmer file alias to one target. Keep unsupported Manx and Ladin failures visible; Ladino is a different language. Offline upload regressions pass; no uploads were run.

Thanks to xet7 !
2026-09-13 18:31:49 +03:00
Lauri Ojansivu d5363a26bf Repair Veps board and username controls and unlock instruction
Replace three unflagged Finnish labels and one flagged account instruction with dictionary-based Veps. Preserve valid shared Nimi. Composed username and purpose-clause wording is low confidence; correction regression checks pass.

Thanks to xet7 !
2026-09-13 18:29:51 +03:00
Lauri Ojansivu 13ed1e3ea9 Record completed Colombian Spanish alias review in translation audit
Document 6db460891, preserve valid alternatives and update the correction inventory to 16,000 records. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:28:58 +03:00
Lauri Ojansivu 6db4608913 Repair Colombian Spanish calendar and duration labels after alias review
Restore Gregorian and ISO week detail in both calendar labels and use Tiempo for the alias time-spent board view. Preserve seven valid Spanish wording alternatives. Translation correction regressions pass.

Thanks to xet7 !
2026-09-13 18:28:46 +03:00
Lauri Ojansivu 1debaff9e8 Document Colombian Spanish upload fix and remaining alias review
Record 27a566a0d under Upcoming and in the dated translation audit. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:27:58 +03:00
Lauri Ojansivu 27a566a0d5 Fix Colombian Spanish Transifex mapping and duplicate target uploads
Map es-CO to supported es_CO and prefer explicit local mappings when a legacy alias shares the remote code. Report skipped aliases rather than overwriting one target twice. Offline force-upload tests pass; no remote upload was run. Nine local alias differences still need reconciliation.

Thanks to xet7 !
2026-09-13 18:27:46 +03:00
Lauri Ojansivu 46a8b785f8 Update dated translation audit after Veps calendar label repairs
Record 462f3bb78, 14,472 corrected findings, 1,372 pending and 15,997 exact repair records. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:26:28 +03:00
Lauri Ojansivu 462f3bb780 Translate Chinese and Japanese calendar labels into Veps
Use dictionary-attested country genitives Kitain and Japonijan with the published Veps calendar noun. Positive and negative language regressions pass; composed terminology remains subject to fluent-speaker review.

Thanks to xet7 !
2026-09-13 18:26:17 +03:00
Lauri Ojansivu 893daece12 Record dated Veps error and week translation repairs
Document 4a06f2abd and the current audit totals, retaining outstanding language review. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:25:10 +03:00
Lauri Ojansivu 4a06f2abdf Repair Veps existence errors and week display text
Replace four Finnish-seeded findings with dictionary-based Veps text. Preserve the distinction between missing and uncreated users and retain ISO 8601. Composed technical wording is low confidence; fluent-speaker review remains necessary. Translation correction regressions pass.

Thanks to xet7 !
2026-09-13 18:25:01 +03:00
Lauri Ojansivu f079c5022a Update dated translation audit after Veps lockout repairs
Record 643cabc3c, low-confidence language review and current totals: 14,466 corrected original findings, 1,378 pending and 15,991 exact correction records. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:24:03 +03:00
Lauri Ojansivu 643cabc3c8 Repair Finnish-seeded Veps locked-user messages
Use attested Veps vocabulary for showing only locked users and confirming all users were unlocked. Preserve the distinction in positive and negative regression checks. Composed plural and technical account wording is low confidence and needs fluent-speaker review; correction suite passes.

Thanks to xet7 !
2026-09-13 18:23:53 +03:00
Lauri Ojansivu f289f65d75 Record Veps action-label repairs and dated translation audit progress
Document a5577d919 and the 15,989 exact correction records. Original Veps findings and restored translations remain outstanding. Audit-progress and changelog-format checks pass.

Thanks to xet7 !
2026-09-13 18:22:35 +03:00
Lauri Ojansivu a5577d9196 Replace Finnish Veps add labels with attested imperative and participle
Use Ližada for Add and Ližatud for Added, following the dictionary conjugation of ližata. Record exact repairs and positive/negative language regression checks. Translation correction suite passes; wider Veps findings remain under review.

Thanks to xet7 !
2026-09-13 18:22:24 +03:00
Lauri Ojansivu c7704b880a Record Veps basic color repair progress
Reference dated fix 56f8ce913 and record 15,987 correction records. Original pending findings remain 1,380; preserve specialized shade and wider language review requirements.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:18:56 +03:00
Lauri Ojansivu 56f8ce913c Repair Finnish-seeded Veps basic color labels
Replace eight unflagged Finnish color names with attested Veps vocabulary from the Veps word list. Add positive/negative vocabulary regression checks; specialized shades remain queued for semantic review.

Validation: complete correction-ledger suite passes for exact values, placeholders, JSON examples, key order and merge preservation.

Thanks to xet7 !
2026-09-13 18:18:49 +03:00
Lauri Ojansivu 439c017a25 Record Veps counted-duration validation progress
Reference dated validation commit and distinguish verified duration inflection from remaining compound-selector and broader grammar reviews.

Validation: audit-progress exact-value and summary checks pass.

Thanks to xet7 !
2026-09-13 18:18:06 +03:00
Lauri Ojansivu 10d3b35154 Validate Veps duration inflection and prevent Finnish regression
Read actual uptime composition and verify päiväd is also the Veps singular partitive, compatible with the counted-duration context. Clarify correction provenance and add positive/negative language-vocabulary assertions for repaired date units.

Validation: full correction-ledger suite passes; broader Veps grammar review remains outstanding.

Thanks to xet7 !
2026-09-13 18:18:06 +03:00
Lauri Ojansivu 393e1ad71b Record Veps calendar selector repair progress
Reference dated fix ffbf2ef72 and record 14,464 corrected findings, 1,380 pending findings and 15,979 correction records. Preserve low-confidence compound terminology and wider review requirements.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:17:23 +03:00
Lauri Ojansivu ffbf2ef727 Repair Veps calendar selector vocabulary
Replace Finnish calendar and Turkic-seeded selector text with Veps. Confirm kalendar' in actual Veps newspaper and corpus usage. Compound selector wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:17:17 +03:00
Lauri Ojansivu b4372aad93 Record initial Veps date-unit repair progress
Reference dated local fix b077128b2 and record 15,977 correction records. Original pending findings remain 1,381; preserve composed-UI inflection and wider linguistic review requirements.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:16:37 +03:00
Lauri Ojansivu b077128b27 Repair basic Veps date-unit vocabulary
Replace four unflagged Finnish-seeded date-unit values with Veps vocabulary from the Veps Wikibooks word list. Preserve singular/plural distinction. Composed-UI inflection remains a low-confidence review item.

Validation: full correction-ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:16:31 +03:00
Lauri Ojansivu e8ef8c6946 Record evidence-backed Corsican translation review
Reference dated review ad209a3cb, record 179 retained findings and 1,381 pending findings, and preserve remaining linguistic validation scope.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:15:34 +03:00
Lauri Ojansivu ad209a3cba Validate and retain Corsican reactivity terminology
Review the flagged reactivity label against actual Corsican Assembly and native Corsican usage. Reattività is attested Corsican; identical Italian spelling does not justify overwriting compatible wording. Preserve the configuration variable and record the evidence-backed retention.

Validation: audit-progress exact-value classification passes.

Thanks to xet7 !
2026-09-13 18:15:28 +03:00
Lauri Ojansivu 33fcd0e3ed Record corrected Klingon retained-value review
Reference dated fix 1c53f96ad, correct the broader German-seed review summary and record 15,973 correction records. Original pending findings remain 1,382; restored and unflagged linguistic review continues.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:14:52 +03:00
Lauri Ojansivu 1c53f96ad4 Correct mistaken Klingon Cron retention review
The retained value was German Zeitplan, not the tool name described by its review. Replace it with Cron, remove the erroneous review and record the exact correction. Add positive and negative regression assertions for the technical name.

Validation: Klingon semantic and complete correction-ledger suites pass.

Thanks to xet7 !
2026-09-13 18:14:46 +03:00
Lauri Ojansivu e9a1aa6a78 Record completion of original Venetian audit repairs
Reference dated fix 003a34cf3 and record all 429 original Venetian findings repaired, 14,463 total corrected findings, 1,382 pending findings and 15,972 correction records. Retain restored-value and low-confidence linguistic review.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:13:49 +03:00
Lauri Ojansivu 003a34cf32 Repair remaining original Venetian audit findings
Replace thirty Italian/English-seeded Venetian display, SMTP, WIP and calendar labels. Preserve private-only access, irreversible vote loss, task movement direction and calendar identities. Direct wording and specialized calendar terminology remain low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass. Original Venetian queue is empty; restored and unflagged values still require review.

Thanks to xet7 !
2026-09-13 18:13:37 +03:00
Lauri Ojansivu f9f8e660f2 Record Venetian rule and shortcut repair progress
Reference dated fix 82a9ae61b and record 14,433 corrected findings, 1,412 pending findings and 15,942 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:12:47 +03:00
Lauri Ojansivu 82a9ae61b5 Repair Venetian rule and keyboard shortcut translations
Replace fifteen Italian-seeded rule and shortcut values. Preserve uncheck action, comma-separated example, maximum task limit and current-user assigned-card filter. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:12:40 +03:00
Lauri Ojansivu 9f90b8ffd1 Updated git mirror script.
Thanks to xet7 !
2026-09-13 18:12:19 +03:00
Lauri Ojansivu 807de4505c Record Venetian query validation repair progress
Reference dated fix 8a615aa40 and record 14,418 corrected findings, 1,427 pending findings and 15,927 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:12:02 +03:00
Lauri Ojansivu 8a615aa409 Repair Venetian query validation and help messages
Replace fifteen Italian-seeded validation and help values. Preserve positive-integer limit, source placeholders, login-link HTML, blank-field wildcard and image-only restriction. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:11:56 +03:00
Lauri Ojansivu efeb7662d6 Record Venetian selection repair progress
Reference dated fix 9054d1ee2 and record 14,403 corrected findings, 1,442 pending findings and 15,912 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:11:12 +03:00
Lauri Ojansivu 9054d1ee2a Repair Venetian selection and notification translations
Replace fifteen Italian-seeded values. Preserve byte units, archive entity distinctions, invitation acceptance and watched-item notification scope. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:11:01 +03:00
Lauri Ojansivu 0bd7df8f70 Record Venetian import and list repair progress
Reference dated local fix 73c8cb4b0 and record 14,388 corrected findings, 1,457 pending findings and 15,897 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:10:22 +03:00
Lauri Ojansivu 73c8cb4b00 Repair Venetian import mapping and list warnings
Replace twenty Italian-seeded controls. Preserve unmapped-member fallback, keyboard enabled/disabled states, last-admin guard, label text visibility and irreversible label/list loss. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:10:16 +03:00
Lauri Ojansivu 6dd3395c61 Record Venetian search scope repair progress
Reference dated fix 3a139c82a and record 14,368 corrected findings, 1,477 pending findings and 15,877 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:09:33 +03:00
Lauri Ojansivu 3a139c82ae Repair Venetian search scope and modified-date help
Replace twelve Italian-seeded help and control values. Correct modified-date direction to days ago or less, preserve member/assignee union and private/public-only scope, and translate checked items as checklist entries. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:09:28 +03:00
Lauri Ojansivu c6dc324ef1 Record Venetian operator help repair progress
Reference dated fix 3e91ec423 and record 14,356 corrected findings, 1,489 pending findings and 15,865 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:08:49 +03:00
Lauri Ojansivu 3e91ec4239 Repair Venetian search operator help and date direction
Replace sixteen Italian-seeded filter and operator-help values. Preserve query syntax, OR behavior, case insensitivity and negated-field meaning; correct created-date direction to days ago or less. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:08:43 +03:00
Lauri Ojansivu c1a4c0ffb5 Record Venetian validation and access repair progress
Reference dated fix 0bb0c863e and record 14,340 corrected findings, 1,505 pending findings and 15,849 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:07:58 +03:00
Lauri Ojansivu 0bb0c863ef Repair Venetian import validation and access errors
Replace fifteen Italian-seeded validation and control values. Preserve CSV/TSV separators, malformed/schema distinction, authorization denial, uniqueness errors and self-invitation prohibition. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:07:52 +03:00
Lauri Ojansivu 6893a68994 Record Venetian account email repair progress
Reference dated fix d21f4d87d and record 14,325 corrected findings, 1,520 pending findings and 15,834 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:07:12 +03:00
Lauri Ojansivu d21f4d87d9 Repair Venetian account email and date messages
Replace twelve Italian-seeded messages with Venetian. Preserve reset, verify and enrollment distinctions, URL/user/site placeholders and email line breaks; remove mixed-language reset subject. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:07:05 +03:00
Lauri Ojansivu 247a32d539 Record Venetian settings and prerequisite repair progress
Reference dated fix 4171503bc and record 14,313 corrected findings, 1,532 pending findings and 15,822 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:06:14 +03:00
Lauri Ojansivu 4171503bcb Repair Venetian settings and deletion prerequisite messages
Replace sixteen Italian-seeded settings and warning values. Preserve default 27, linked-card deletion prerequisites, organization membership guard, irreversible deletion and permitted incomplete due-card scope. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:06:09 +03:00
Lauri Ojansivu 584283e2b5 Record Venetian comment and configuration repair progress
Reference dated fix d2f9dad02 and record 14,297 corrected findings, 1,548 pending findings and 15,806 correction records. Preserve outstanding linguistic and restored-value review.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:05:29 +03:00
Lauri Ojansivu d2f9dad023 Repair Venetian comment and custom-field controls
Replace twenty Italian-seeded labels. Preserve comment-only role, singular not-found meaning, irreversible custom-field history loss and image/link URL distinction. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:05:23 +03:00
Lauri Ojansivu 03ce9857e1 Record Venetian administration repair progress
Reference dated local fix 7a48f1a32 and record 14,277 corrected findings, 1,568 pending findings and 15,786 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:04:36 +03:00
Lauri Ojansivu 7a48f1a323 Repair Venetian administration and archive translations
Replace twenty Italian-seeded admin, archive and upload messages with Venetian. Preserve active/inactive state meanings, offline data-loss warning, HTML tags and size placeholders. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:04:31 +03:00
Lauri Ojansivu 3ef2392b9c Record Venetian date activity repair progress
Reference dated fix d653f9771 and record 14,257 corrected findings, 1,588 pending findings and 15,766 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:03:34 +03:00
Lauri Ojansivu d653f9771b Repair Venetian date and custom-field activity translations
Replace twelve Italian-seeded activity and background labels. Restore completed/uncompleted and set/unset action meanings, preserving ordered percent placeholders and source/destination movement. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:03:29 +03:00
Lauri Ojansivu 9f7ed8936e Record Venetian lockout and reminder repair progress
Reference dated fix 7615e1916 and record 14,245 corrected findings, 1,600 pending findings and 15,754 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:02:52 +03:00
Lauri Ojansivu 7615e19169 Repair Venetian lockout and due-reminder translations
Replace fifteen Italian-seeded accessibility, lockout and reminder messages with Venetian. Preserve timing units, old/new time placeholders and approaching/current/past deadline distinctions. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:02:46 +03:00
Lauri Ojansivu b09798c2e9 Record Venetian date and display repair progress
Reference dated local fix a617c4300 and record 14,230 corrected findings, 1,615 pending findings and 15,739 correction records. Preserve outstanding linguistic and restored-value reviews.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:01:33 +03:00
Lauri Ojansivu a617c43006 Repair Venetian date, display and worker-role translations
Replace twenty Italian-seeded labels with Venetian. Preserve positive-integer validation, keyboard range, worker-only capabilities, notification scope and Node/MongoDB identities. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:01:28 +03:00
Lauri Ojansivu 4e383fcaca Record Venetian rule and membership repair progress
Reference dated fix ed63d39a8 and record 14,210 corrected findings, 1,635 pending findings and 15,719 correction records. Preserve outstanding linguistic and restored-value validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 18:00:45 +03:00
Lauri Ojansivu ed63d39a8f Repair Venetian rule and membership controls
Replace twenty Italian-seeded labels with Venetian. Preserve top/bottom placement, add/assign distinction, removal notification, source placeholders and display threshold. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 18:00:38 +03:00
Lauri Ojansivu 52a84fa79b Record Venetian membership and list repair progress
Reference dated fix a35ca4249 and record 14,190 corrected findings, 1,655 pending findings and 15,699 correction records. Preserve outstanding language and restored-value review.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 17:59:59 +03:00
Lauri Ojansivu a35ca42492 Repair Venetian membership and list behavior translations
Replace twenty Italian-seeded messages with Venetian. Preserve private/public edit restrictions, archive recovery, notification behavior, newline/comma semantics and invitation placeholders. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 17:59:54 +03:00
Lauri Ojansivu cc9d96d7c8 Record Venetian search and import repair progress
Reference dated local fix a5a956ca3 and record 14,170 corrected findings, 1,675 pending findings and 15,679 correction records. Retain outstanding linguistic and restored-value review.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 17:59:07 +03:00
Lauri Ojansivu a5a956ca3f Repair Venetian search and import instructions
Replace twelve Italian-seeded help and display values. Preserve literal search examples, predicate placeholders, descending minus sign, file formats and external menu labels. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger checks pass for tokens, JSON examples, key order and merge preservation.

Thanks to xet7 !
2026-09-13 17:59:01 +03:00
Lauri Ojansivu 7d04c3c644 Record Venetian invitation and permission repair progress
Reference dated fix 8d669c209 and record 14,158 corrected findings, 1,687 pending findings and 15,667 correction records. Preserve outstanding linguistic and restored-value reviews.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 17:58:17 +03:00
Lauri Ojansivu 8d669c209d Repair Venetian invitations and board permission messages
Replace sixteen Italian-seeded labels and invitation messages with Venetian. Preserve member/admin requirements, deletion ordering, irreversible warnings and email placeholders/newlines. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 17:58:11 +03:00
Lauri Ojansivu 761b3e1d56 Record Venetian board and card repair progress
Reference dated fix e8f9a898b and record 14,142 corrected findings, 1,703 pending findings and 15,651 correction records. Preserve outstanding linguistic and restored-value review.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 17:57:28 +03:00
Lauri Ojansivu e8f9a898b5 Repair twenty-five Venetian board and card controls
Replace Italian-seeded card warnings, board controls and copy instructions with Venetian. Preserve no-undo and recovery meanings, star/unstar distinctions, interpolation tokens and JSON property names. Direct wording remains low confidence pending fluent-speaker review.

Validation: all correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 17:57:23 +03:00
Lauri Ojansivu 2bb51d34fb Record Venetian advanced filter repair progress
Reference dated fix 2bb366f9a and record 14,117 corrected findings, 1,728 pending findings and 15,626 correction records. Document exact filter-example regression coverage and outstanding linguistic review.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 17:56:38 +03:00
Lauri Ojansivu 2bb366f9ab Repair Venetian advanced filter instructions and escaping
Translate Italian filter prose to Venetian and restore exact executable examples, operator spacing, quote delimiters and single backslashes. Extend existing regression coverage to Venetian and the escaped apostrophe example. Direct prose remains low confidence pending fluent-speaker review.

Validation: all correction ledger checks and exact filter examples pass.

Thanks to xet7 !
2026-09-13 17:56:31 +03:00
Lauri Ojansivu bf869242bc Record Venetian archive and visibility repair progress
Reference dated fix 6d05bb764 and record 14,116 corrected findings, 1,729 pending findings and 15,625 correction records. Preserve outstanding language and advanced-filter reviews.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 17:55:50 +03:00
Lauri Ojansivu 6d05bb7644 Repair Venetian board visibility and archive translations
Replace nineteen Italian-seeded labels with Venetian. Preserve irreversible deletion warnings, logged-in access semantics, HTML tags and GridFS identity. Direct wording remains low confidence pending fluent-speaker review. Advanced filter instructions remain queued for separate literal-syntax repair.

Validation: correction ledger token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 17:55:45 +03:00
Lauri Ojansivu dd139222f0 Record Venetian checklist and removal repair progress
Reference dated fix 2acd6cc83 and record 14,097 corrected findings, 1,748 pending findings and 15,606 correction records, with linguistic review still outstanding.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 17:54:48 +03:00
Lauri Ojansivu 2acd6cc835 Repair Venetian removal and checklist activity messages
Replace twenty-five Italian-seeded activity and insertion labels. Preserve checked/unchecked and complete/incomplete meanings, source placeholders and top/bottom placement; remove the erroneous digit before the subtask placeholder. Direct wording remains low confidence pending fluent-speaker review.

Validation: correction inventory token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 17:54:44 +03:00
Lauri Ojansivu 9f908a7ef4 Record Venetian activity translation progress
Reference dated local fix 65f266e36 and record 14,072 corrected findings, 1,773 pending findings and 15,581 exact correction records. Preserve outstanding linguistic validation.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 17:54:00 +03:00
Lauri Ojansivu 65f266e36d Repair twenty-five Venetian activity translations
Replace Italian-seeded activity messages with Venetian while preserving event distinctions, source/destination hierarchy and every interpolation token. Direct kanban wording is low confidence and awaits fluent-speaker review.

Validation: correction ledger checks pass for tokens, JSON examples, key order and merge preservation.

Thanks to xet7 !
2026-09-13 17:53:55 +03:00
Lauri Ojansivu 403d45c0ee Record Venetian repair progress and clarify locale identities
Reference dated translation fix 88c871b27. Record 14,047 corrected findings, 1,798 pending findings and 15,556 correction records; distinguish Venetian and Veps from Venda using the language registry.

Validation: audit progress and changelog format pass.

Thanks to xet7 !
2026-09-13 17:53:12 +03:00
Lauri Ojansivu 88c871b279 Repair Venetian account and lockout translations
Replace thirteen Italian-seeded account controls with Venetian. Preserve username/password error distinctions and lockout protection. Direct wording is low confidence and awaits fluent-speaker review; consult Venetian WordPress language-team orthography.

Validation: correction inventory token, JSON example, key-order and merge-preservation checks pass.

Thanks to xet7 !
2026-09-13 17:53:06 +03:00
Lauri Ojansivu b8a7caf476 Record completion of original main Venda audit repairs
Reference dated local fix 180ca33c5 and record 14,034 corrected findings, 1,811 pending findings and 15,543 correction records. Keep restored-value and fluent-speaker validation outstanding.

Validation: audit progress and changelog format pass.

Thanks to xet7 !
2026-09-13 17:52:11 +03:00
Lauri Ojansivu 180ca33c5d Repair Venda warnings, permissions and calendar labels
Replace 39 Zulu-seeded messages and 18 calendar labels, including three unflagged Afrikaans values, with Tshivenda. Preserve no-undo warnings, private-only access, numeric validation and calendar identities. Low-confidence wording and specialized calendar terminology await fluent-speaker review.

Validation: correction inventory passes token, JSON example, key-order and merge-preservation checks. All original main Venda audit findings are repaired; broader and restored-value review remains outstanding.

Thanks to xet7 !
2026-09-13 17:52:06 +03:00
Lauri Ojansivu f9d6735f85 Record Venda shortcut and display repair progress
Update dated audit summary and TODO Later with 13,980 corrected findings, 1,865 pending findings and 15,486 exact correction records. Reference local fix 77bf80f43 and retain fluent-speaker validation requirements.

Validation: audit-progress and changelog-format suites pass.

Thanks to xet7 !
2026-09-13 17:50:53 +03:00
Lauri Ojansivu 77bf80f435 Repair thirty Venda display and shortcut translations
Replace Zulu-seeded shortcut, visibility, SMTP and migration labels with Tshivenda. Preserve display thresholds, ISO 8601 and technical protocol names. Direct wording is low confidence and awaits fluent-speaker review.

Validation: all 15,486 correction records pass placeholder, JSON example, key-order and merge-preservation checks.

Thanks to xet7 !
2026-09-13 17:50:44 +03:00
Lauri Ojansivu fbdcc25f38 Record Venda storage and configuration translation progress
Record dated fix 35f909774, 13,950 corrected original findings, 1,895 pending and 15,456 exact corrections. Keep remaining review and verification scope open.

Thanks to xet7 !
2026-09-13 17:47:01 +03:00
Lauri Ojansivu 35f9097741 Repair thirty Venda S3 and configuration labels
Replace Zulu-seeded storage, search and size controls with Tshivenda. Preserve S3 URL and region examples, SSL/TLS names and literal server troubleshooting commands. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:46:50 +03:00
Lauri Ojansivu 798d571345 Record Venda rule and migration confirmation repair progress
Record dated fix 4c42a6808, 13,920 corrected original findings, 1,925 pending and 15,426 exact corrections. Keep remaining language review and full audit scope open.

Thanks to xet7 !
2026-09-13 17:46:10 +03:00
Lauri Ojansivu 4c42a68088 Repair thirty Venda rule and migration confirmation labels
Replace Zulu-seeded rule, rescue-dialog and migration confirmation prose with Tshivenda. Preserve literal IDs, keyboard ranges, full restore scope and irreversible or difficult-to-undo warnings. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:45:56 +03:00
Lauri Ojansivu bfb9db0f7a Record Venda notification and query-validation repair progress
Record dated fix 0f8751df8, 13,890 corrected original findings, 1,955 pending and 15,396 exact corrections. Keep remaining audit and verification scope open.

Thanks to xet7 !
2026-09-13 17:43:33 +03:00
Lauri Ojansivu 0f8751df86 Repair thirty Venda notification and search validation labels
Replace Zulu-seeded selection, notification, checklist ordering and query validation prose with Tshivenda. Preserve exact tokens, HTML links, positive limits and muted notification meaning. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:43:23 +03:00
Lauri Ojansivu e68cbefd4b Record Venda migration and monitoring repair progress
Record dated fix cc2eaa2bd, 13,860 corrected original findings, 1,985 pending and 15,366 exact corrections. Keep outstanding review and full audit scope open.

Thanks to xet7 !
2026-09-13 17:42:45 +03:00
Lauri Ojansivu cc2eaa2bd3 Repair thirty Venda migration and monitoring messages
Replace Zulu-seeded migration outcomes, thresholds, background execution and monitoring labels with Tshivenda. Preserve numeric limits and administrator-only scope. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:42:35 +03:00
Lauri Ojansivu 018eb0e353 Record Venda validation and list translation progress
Record dated fix 28f1db700, 13,830 corrected original findings, 2,015 pending and 15,336 exact corrections. Preserve remaining review and full audit scope.

Thanks to xet7 !
2026-09-13 17:41:36 +03:00
Lauri Ojansivu 28f1db7005 Repair twenty-five Venda validation and list controls
Replace Zulu-seeded validation, keyboard, labels and list messages with Tshivenda. Preserve source tokens, year example, minimum-admin constraint and irreversible list loss warning. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:41:27 +03:00
Lauri Ojansivu 255e04e06e Record Venda import and checklist translation progress
Record dated fix 1baefe89e, 13,805 corrected original findings, 2,040 pending and 15,311 exact corrections. Keep remaining review and full verification scope open.

Thanks to xet7 !
2026-09-13 17:40:42 +03:00
Lauri Ojansivu 1baefe89ee Repair twenty-five Venda import and checklist controls
Replace Zulu-seeded import, member mapping, checklist display and storage labels with Tshivenda. Preserve formats, source tokens, selected-parts-only import and unmapped-member defaults. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:40:33 +03:00
Lauri Ojansivu a684342f95 Record Venda export and search-option translation progress
Record dated fix bff84678e, 13,780 corrected original findings, 2,065 pending and 15,286 exact corrections. Keep remaining review and full audit scope open.

Thanks to xet7 !
2026-09-13 17:39:50 +03:00
Lauri Ojansivu bff84678e8 Repair twenty-five Venda export and search option translations
Replace Zulu-seeded export fields, filesystem fixes and search instructions with Tshivenda. Preserve placeholders, literal search syntax, date/people fields and positive/negative integer meanings. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:39:40 +03:00
Lauri Ojansivu c216066da7 Record Venda email and authorization translation progress
Record dated fix 1436d81f2, 13,755 corrected original findings, 2,090 pending and 15,261 exact corrections. Keep outstanding language review and full verification scope open.

Thanks to xet7 !
2026-09-13 17:38:52 +03:00
Lauri Ojansivu 1436d81f25 Repair twenty-five Venda email and authorization messages
Replace Zulu-seeded verification emails, format errors and permission requirements with Tshivenda. Preserve source tokens, mail line breaks, WIP/JSON/CSV/TSV names and zoom bounds. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:38:40 +03:00
Lauri Ojansivu 7a95ede026 Record Venda date and account-email translation progress
Record dated fix 3e7746666, 13,730 corrected original findings, 2,115 pending and 15,236 exact corrections. Keep remaining review and full verification scope open.

Thanks to xet7 !
2026-09-13 17:38:00 +03:00
Lauri Ojansivu 3e7746666a Repair twenty-five Venda dates and account-email translations
Replace Zulu-seeded date controls, subtasks and account emails with Tshivenda. Preserve source placeholders, mail line breaks, SMTP/Planning Poker names and distinct time fields. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:37:50 +03:00
Lauri Ojansivu c2c78b881d Record Venda branding and deletion translation progress
Record dated fix 59286c27f, 13,705 corrected original findings, 2,140 pending and 15,211 exact corrections. Keep remaining validation and full audit scope open.

Thanks to xet7 !
2026-09-13 17:37:14 +03:00
Lauri Ojansivu 59286c27f7 Repair twenty-five Venda branding and deletion settings labels
Replace Zulu-seeded custom branding, default settings and destructive confirmations with Tshivenda. Preserve source tokens, numeric defaults, no-undo warnings and organization/team deletion blockers. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:37:04 +03:00
Lauri Ojansivu afa2a06aba Record Venda scheduling and custom-content translation progress
Record dated fix 0cbfa4f87, 13,680 corrected original findings, 2,165 pending and 15,186 exact corrections. Keep remaining review and broader audit scope open.

Thanks to xet7 !
2026-09-13 17:36:24 +03:00
Lauri Ojansivu 0cbfa4f87c Repair twenty-five Venda scheduling and custom-content labels
Replace Zulu-seeded scheduled-job outcomes and custom HTML/JSON controls with Tshivenda. Preserve %{value}, HTML entities, assetlinks.json and success/failure versus pause/resume distinctions. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:36:14 +03:00
Lauri Ojansivu 7e700f14ab Record Venda checklist and interface repair progress
Record dated fix ba8229423, 13,655 corrected original findings, 2,190 pending and 15,161 exact corrections. Keep outstanding verification and wider audit scope open.

Thanks to xet7 !
2026-09-13 17:35:33 +03:00
Lauri Ojansivu ba8229423f Repair twenty-five Venda checklist and board interface labels
Replace Zulu-seeded checklist, star, auto-width and template controls with Tshivenda. Preserve enable/disable meanings and source tokens; use lutombo for blue, supported by https://www.justice.gov.za/constitution/SAConstitution-web-ven.pdf . Other wording remains low confidence and open to fluent review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:35:22 +03:00
Lauri Ojansivu 5aba221ce6 Record Venda board-management translation progress
Record dated fix 779dcb02b, 13,630 corrected original findings, 2,215 pending and 15,136 exact corrections. Keep remaining audit and verification scope open.

Thanks to xet7 !
2026-09-13 17:34:36 +03:00
Lauri Ojansivu 779dcb02b9 Repair twenty-five Venda board-management translations
Replace Zulu-seeded background, backup, cleanup, visibility and card settings labels with Tshivenda. Preserve source tokens, HTML emphasis and permanent loss warnings. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:34:27 +03:00
Lauri Ojansivu 334855286d Record Venda archive and settings translation progress
Record dated fix a89ed3821, 13,605 corrected original findings, 2,240 pending and 15,111 exact corrections. Keep remaining review and full audit scope open.

Thanks to xet7 !
2026-09-13 17:33:50 +03:00
Lauri Ojansivu a89ed3821c Repair twenty-five Venda archive and storage settings labels
Replace Zulu-seeded archive, attachment settings, automation and avatar labels with Tshivenda. Preserve the avatar size token, URL scheme instructions and archive scheduling success/failure distinctions. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:33:38 +03:00
Lauri Ojansivu 45e367a2e6 Record Venda filter and workspace repair progress
Record dated fix b110191f1, 13,580 corrected original findings, 2,265 pending and 15,086 exact corrections. Preserve remaining review and full audit scope.

Thanks to xet7 !
2026-09-13 17:33:00 +03:00
Lauri Ojansivu b110191f1b Repair sixteen Venda filter and workspace translations
Replace Zulu-seeded advanced-filter help, workspace controls, uploads and offline loading prose with Tshivenda. Preserve executable examples, placeholders and the refresh data-loss warning. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:32:51 +03:00
Lauri Ojansivu d53717154d Record Venda activity and administrator translation progress
Record dated fix 4b6da7008, 13,564 corrected original findings, 2,281 pending and 15,070 exact corrections. Keep remaining review and verification scope open.

Thanks to xet7 !
2026-09-13 17:32:11 +03:00
Lauri Ojansivu 4b6da70089 Repair twenty-four Venda activity and administrator controls
Replace Zulu-seeded import, movement, custom-field, workspace and administrator labels with Tshivenda. Preserve interpolation counts, HTML tags and active/inactive state distinctions. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:32:02 +03:00
Lauri Ojansivu be6a20676f Record Venda reminder and checklist translation progress
Record dated fix af9aa74b0, 13,540 corrected original findings, 2,305 pending and 15,046 exact corrections. Keep outstanding verification and wider audit scope open.

Thanks to xet7 !
2026-09-13 17:31:27 +03:00
Lauri Ojansivu af9aa74b0a Repair twenty Venda reminder and checklist activity messages
Replace Zulu-seeded reminders, list creation and checklist activities with Tshivenda. Preserve source placeholders, due-soon/now/past distinctions and completed versus incomplete states. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:31:15 +03:00
Lauri Ojansivu b7a5184d66 Record Venda account-lockout translation progress
Record dated fix 77997ecb9, 13,520 corrected original findings, 2,325 pending and 15,026 exact corrections. Keep outstanding language review and full audit scope open.

Thanks to xet7 !
2026-09-13 17:30:32 +03:00
Lauri Ojansivu 77997ecb98 Repair twenty Venda account-lockout and date activity messages
Replace Zulu-seeded lockout controls and dated activities with Tshivenda. Distinguish locked/unlocked and known/unknown states; retain source time and card placeholders. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:30:23 +03:00
Lauri Ojansivu 6f9f9c944e Record Venda diagnostic and account translation progress
Record dated fix 2f7658de8, 13,500 corrected original findings, 2,345 pending and 15,006 exact corrections. Keep remaining review and verification scope open.

Thanks to xet7 !
2026-09-13 17:29:44 +03:00
Lauri Ojansivu 2f7658de88 Repair twenty-five Venda diagnostics, dates and account labels
Replace Zulu-seeded runtime, date-field, accessibility and account prose with Tshivenda. Keep Node heap and RSS terms, temporary lockout and received/start/due/end distinctions. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:29:34 +03:00
Lauri Ojansivu a196fb9e78 Record Venda permission and diagnostic translation progress
Record dated fix 6ced21a16, 13,475 corrected original findings, 2,370 pending and 14,981 exact corrections. Preserve remaining audit and verification scope.

Thanks to xet7 !
2026-09-13 17:28:58 +03:00
Lauri Ojansivu 6ced21a163 Repair twenty Venda permissions and runtime diagnostic labels
Replace Zulu-seeded archive, trigger, shortcut, worker permission and Node/MongoDB diagnostic prose with Tshivenda. Preserve keyboard ranges and literal technical names. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:28:48 +03:00
Lauri Ojansivu 8939d6fa33 Record Venda migration and display translation progress
Record dated fix 48739c6ac, 13,455 corrected original findings, 2,390 pending and 14,961 exact corrections. Keep remaining review and verification work open.

Thanks to xet7 !
2026-09-13 17:28:12 +03:00
Lauri Ojansivu 48739c6ac3 Repair twenty-two Venda migration and display controls
Replace Zulu-seeded read-only, lost-card migration and display prose with Tshivenda. Preserve exact identifiers, source placeholders, migration scope and non-archived-only conditions. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:28:01 +03:00
Lauri Ojansivu 5e017f111b Record Venda privacy and rule-action repair progress
Record dated fix 846fd29ad, 13,433 corrected original findings, 2,412 pending and 14,939 exact corrections. Keep outstanding validation and remaining audit work open.

Thanks to xet7 !
2026-09-13 17:27:17 +03:00
Lauri Ojansivu 846fd29ad6 Repair fifteen Venda privacy and rule-action translations
Replace Zulu-seeded card windows, privacy descriptions, invitations and rule actions with Tshivenda. Preserve source tokens, public visibility versus edit permission and top/bottom placement directions. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:27:02 +03:00
Lauri Ojansivu 10bdbe155c Record Venda movement and permission translation progress
Record dated fix bdcb23fd5, 13,418 corrected original findings, 2,427 pending and 14,924 exact corrections. Preserve outstanding review and full audit scope.

Thanks to xet7 !
2026-09-13 17:26:27 +03:00
Lauri Ojansivu bdcb23fd58 Repair fifteen Venda movement and permission descriptions
Replace Zulu-seeded list movement, storage, notifications and user-role explanations with Tshivenda. Preserve the imported-role permission ceiling and restricted-user capabilities. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:26:18 +03:00
Lauri Ojansivu a6898fd859 Record Venda scope, import and archive translation progress
Record dated fix 67b6d548a, 13,403 corrected original findings, 2,442 pending and 14,909 exact corrections. Keep remaining language and runtime verification scope open.

Thanks to xet7 !
2026-09-13 17:25:43 +03:00
Lauri Ojansivu 67b6d548a1 Repair eighteen Venda search scope and import controls
Replace Zulu-seeded privacy-scope, home-board, import and archive text with Tshivenda. Preserve placeholders, literal vendor navigation labels, restoration and permanent deletion distinctions. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:25:31 +03:00
Lauri Ojansivu e27ab9d1bf Record further Venda search-help repair progress
Record dated fix 41fd76d6a, 13,385 corrected original findings, 2,460 pending and 14,891 exact corrections. Keep outstanding validation and broader audit scope open.

Thanks to xet7 !
2026-09-13 17:24:45 +03:00
Lauri Ojansivu 41fd76d6ab Repair twelve further Venda search-help translations
Replace Zulu-seeded operator and archive-status explanations with Tshivenda. Preserve literal examples, angle-bracket arguments, all source placeholders and has-field negation. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:24:36 +03:00
Lauri Ojansivu 3a0e6b73e0 Record Venda search-help translation progress
Record dated fix 629fb613d, 13,373 corrected original findings, 2,472 pending and 14,879 exact corrections. Preserve remaining review and verification work.

Thanks to xet7 !
2026-09-13 17:23:58 +03:00
Lauri Ojansivu 629fb613d6 Repair ten Venda search-help translations
Replace Zulu-seeded query instructions and operator help with Tshivenda. Keep literal examples, angle-bracket arguments and source placeholders unchanged. Explain OR versus AND distinctly. Low-confidence prose remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:23:49 +03:00
Lauri Ojansivu 0d5d2873f6 Record Venda invitation and export translation progress
Record dated fix 6ecc8171b, 13,363 corrected original findings, 2,482 pending and 14,869 exact corrections. Preserve remaining review and verification scope.

Thanks to xet7 !
2026-09-13 17:23:12 +03:00
Lauri Ojansivu 6ecc8171bb Repair ten Venda invitation and card-export translations
Replace Zulu-seeded invitation emails, due-card visibility, export and filtering prose with Tshivenda. Preserve invitation placeholders, email line breaks and permission boundaries. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:23:02 +03:00
Lauri Ojansivu ac7bcde378 Record Venda copy and deletion warning audit progress
Record dated fix c59c09783, 13,353 corrected original findings, 2,492 pending and 14,859 exact corrections. Keep remaining review and verification work open.

Thanks to xet7 !
2026-09-13 17:22:27 +03:00
Lauri Ojansivu c59c097837 Repair fifteen Venda copy controls and deletion warnings
Replace Zulu-seeded copy, conversion and deletion prose with Tshivenda. Preserve placeholders, irreversible loss warnings and the AND condition requiring an empty duplicate plus a populated namesake list. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:22:18 +03:00
Lauri Ojansivu 5912337a50 Record Venda board and card warning repair progress
Record dated fix b2b1752c8, 13,338 corrected original findings, 2,507 pending and 14,844 correction records. Keep language validation and wider audit work open.

Thanks to xet7 !
2026-09-13 17:21:34 +03:00
Lauri Ojansivu b2b1752c80 Repair twenty Venda board and card warnings and controls
Replace Zulu-seeded board movement, assignment, archive and deletion prose with Tshivenda. Preserve placeholders, permanent loss warnings and restricted commenting permissions. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:21:25 +03:00
Lauri Ojansivu e637be0a64 Record Venda activity and attachment translation progress
Record dated fix 6a68c0e37, 13,318 corrected original findings, 2,527 pending and 14,824 exact corrections. Retain outstanding language review and broader audit work.

Thanks to xet7 !
2026-09-13 17:20:41 +03:00
Lauri Ojansivu 6a68c0e373 Repair twenty Venda activity and attachment controls
Replace Zulu-seeded activity, card placement, archive and attachment messages with Tshivenda. Preserve placeholders, administrator capabilities and the permanent deletion/no-undo warning. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:20:30 +03:00
Lauri Ojansivu 3a4d689196 Record Venda movement and removal translation progress
Record dated fix f92cfa5b1 and counts of 13,298 corrected original findings, 2,547 pending and 14,804 correction records. Keep remaining verification and full audit scope open.

Thanks to xet7 !
2026-09-13 17:19:58 +03:00
Lauri Ojansivu f92cfa5b1f Repair sixteen Venda movement and removal activity messages
Replace Zulu-seeded messages directly with Tshivenda. Preserve old and new board, list and lane placeholders, exact checkList token case and percent token counts. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:19:49 +03:00
Lauri Ojansivu 7d58e0d1a4 Update audit progress after further Venda activity repairs
Record dated fix 18429316a, 13,282 corrected original findings, 2,563 pending and 14,788 exact correction records. Preserve remaining validation and repair scope.

Thanks to xet7 !
2026-09-13 17:19:05 +03:00
Lauri Ojansivu 18429316ab Replace fifteen further Zulu-seeded Venda activity messages
Write Tshivenda archive, checklist, comment, import, membership and card movement messages with source placeholders intact. Completed imports remain completed actions. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:18:55 +03:00
Lauri Ojansivu 74ffe39f76 Record resumed Venda repairs and current translation progress
Record dated fix 2c5e765a0, 13,267 corrected original findings, 2,578 pending and 14,773 exact corrections. Preserve outstanding fluent validation and wider repair scope.

Thanks to xet7 !
2026-09-13 17:18:12 +03:00
Lauri Ojansivu 2c5e765a02 Replace ten Zulu-seeded Venda activity translations
Write Tshivenda activity prose for attachment, membership, checklist, label and archive actions with all source placeholders intact. Vocabulary is informed by available Tshivenda wordlists and existing kanban context; wording is low confidence and remains open to fluent-speaker review.

Validation: audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:18:02 +03:00
Lauri Ojansivu c076717d28 Update Luganda and Fijian calendar audit progress
Record dated fix 9b78486c5 and 13,257 corrected original findings, 2,588 pending and 14,763 correction records. Keep remaining verification and broader audit work open.

Thanks to xet7 !
2026-09-13 17:17:19 +03:00
Lauri Ojansivu 9b78486c52 Repair six Luganda and Fijian calendar labels
Replace English Coptic and tabular Hijri labels using existing locale calendar terminology. Preserve civil versus astronomical epoch distinctions. Specialized wording is low confidence and remains open to fluent-speaker review.

Validation: audited correction regressions verify placeholders, examples, key order and newer translation protection.

Thanks to xet7 !
2026-09-13 17:17:03 +03:00
Lauri Ojansivu 8a4329fbd1 Record Swati, Northern Sotho and Tsonga calendar repair progress
Record dated fix e077f92b9 and 13,251 corrected original findings, 2,594 pending and 14,757 correction records. Keep broader language validation and browser checks open.

Thanks to xet7 !
2026-09-13 17:16:31 +03:00
Lauri Ojansivu e077f92b96 Repair ten Swati, Northern Sotho and Tsonga calendar labels
Replace English Coptic, Buddhist and tabular Hijri labels using existing locale terminology. Retain civil versus astronomical epoch distinctions. Specialized wording is low confidence and remains open to fluent-speaker review.

Validation: audited correction regressions preserve placeholders, examples, formatting and key order.

Thanks to xet7 !
2026-09-13 17:16:20 +03:00
Lauri Ojansivu 632d34160d Record Kirundi and Ndebele calendar repair progress
Record dated fix 2a750c70c, 13,241 corrected original findings, 2,604 pending and 14,747 exact corrections. Preserve remaining language-validation and browser-verification work.

Thanks to xet7 !
2026-09-13 17:15:47 +03:00
Lauri Ojansivu 2a750c70c0 Repair eight Kirundi and Ndebele calendar labels
Replace English Buddhist, Coptic and tabular Hijri labels with locale wording. Keep civil and astronomical epoch variants distinct. Specialized translations are low confidence and remain open to fluent-speaker review.

Validation: audited correction regressions verify placeholders, examples, order and newer translation protection.

Thanks to xet7 !
2026-09-13 17:15:33 +03:00
Lauri Ojansivu 9e7129dd54 Update audit progress for Setswana and Sesotho calendar repairs
Record dated fix 205a2317a and counts of 13,233 corrected original findings, 2,612 pending and 14,739 correction records. Preserve remaining language validation and audit scope.

Thanks to xet7 !
2026-09-13 17:15:05 +03:00
Lauri Ojansivu 205a2317ae Repair Setswana and Sesotho calendar labels
Replace English Coptic labels in Setswana and Sesotho and the English civil Hijri label in Sesotho using existing locale calendar terminology. Specialized wording is low confidence and remains open to fluent-speaker review.

Validation: audited correction regressions verify placeholders, examples, formatting and key order.

Thanks to xet7 !
2026-09-13 17:14:55 +03:00
Lauri Ojansivu 0f30bf0442 Record Aymara calendar repairs and current audit counts
Record dated fix 1b930ff38, 13,230 corrected original findings, 2,615 pending and 14,736 exact correction records. Keep specialized language validation and broader audit work open.

Thanks to xet7 !
2026-09-13 17:14:20 +03:00
Lauri Ojansivu 1b930ff380 Repair three Aymara Hijri calendar labels
Replace English labels with Aymara using existing pachachimpu terminology. Distinguish civil and astronomical tabular epochs from Saudi moon sighting. Specialized wording is low confidence and remains open to fluent-speaker review.

Validation: audited correction regressions preserve tokens, examples and key order.

Thanks to xet7 !
2026-09-13 17:14:05 +03:00
Lauri Ojansivu cbfba243ff Record completed Klingon German-seed review and remaining audit scope
Record dated fix 1044eebc9 and 14,733 corrections. All 829 broader German-identical Klingon candidates are reviewed: 828 repairs and one retained technical name. Fluent review, browser verification and the original multi-language audit remain open.

Thanks to xet7 !
2026-09-13 17:13:20 +03:00
Lauri Ojansivu 1044eebc97 Repair 37 Klingon search keywords and verify localized parsing
Replace remaining German-seeded operator and predicate keywords with whitespace-free Klingon terms supported by the apostrophe-aware parser. Exercise actual locale values through Query for user, member, assignee, creator, board, swimlane, list, title, description, attachment and checklist searches.

Low-confidence Klingon wording remains open to fluent-speaker review. Audited corrections, tokens and localized parser regressions pass; browser verification remains pending.

Thanks to xet7 !
2026-09-13 17:13:09 +03:00
Lauri Ojansivu 91fc5ccb91 Record localized search parser support and remaining verification
Link 0026390bb and distinguish passing runtime regressions from pending keyword replacements and browser verification.

Thanks to xet7 !
2026-09-13 17:12:20 +03:00
Lauri Ojansivu 0026390bba Accept apostrophes in localized search operator names
Allow straight and curly apostrophes in operator names so Klingon and other apostrophe-bearing localized keywords can be parsed. Keep quoted value parsing and unknown-operator errors unchanged.

Validation: actual Query runtime tests cover localized names, quoted values, normal operators, plain quoted text and unknown names; card-number search regressions pass.

Thanks to xet7 !
2026-09-13 17:11:59 +03:00
Lauri Ojansivu a4b53d2466 Update translation audit after storage repairs and technical-name review
Record dated fix a24ba752c and 14,696 corrections. The broader Klingon queue now consists of 37 search keyword values; 791 were repaired and one technical name retained.

Thanks to xet7 !
2026-09-13 17:11:19 +03:00
Lauri Ojansivu a24ba752c7 Repair 38 Klingon storage labels and retain the Cron tool name
Translate remaining German-seeded storage, scheduling and progress controls directly with placeholders intact. Record Cron as a reviewed technical name rather than replacing its shared spelling. Low-confidence Klingon prose remains open to fluent-speaker review.

Validation: audited correction and Klingon regressions pass.

Thanks to xet7 !
2026-09-13 17:11:09 +03:00
Lauri Ojansivu 5987576f0e Record latest Klingon scheduling repairs in audit progress
Record dated fix 0db60bab0, 14,658 correction records and 76 remaining broader Klingon findings. Retain unresolved original audit findings and search parser support requirement.

Thanks to xet7 !
2026-09-13 17:10:24 +03:00
Lauri Ojansivu 0db60bab00 Repair 50 Klingon scheduling and migration translations
Replace German-seeded scheduled-job, migration, filesystem and progress labels directly with Klingon. Preserve product names and interpolation tokens. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction and Klingon regressions pass.

Thanks to xet7 !
2026-09-13 17:10:13 +03:00
Lauri Ojansivu ee9703f23b Document incremental Fossil imports and latest translation repairs
Link the incremental import implementation and its real Fossil regression. Update dated translation progress for c950c236e to 14,608 correction records and 126 broader Klingon findings remaining.

Thanks to xet7 !
2026-09-13 17:09:28 +03:00
Lauri Ojansivu 69e4d836cf Extend existing Fossil repositories with incremental Git imports
Use fossil import --incremental when the destination exists, retaining existing history without force overwrite. Re-export selected Git namespaces so repositories created by previous script versions also update without requiring marks files.

Validation: real Fossil 2.28 imports a newly committed Git change, retains old commits and avoids duplicates on a third run. Mock failure and namespace regression checks and Bash syntax pass.

Thanks to xet7 !
2026-09-13 17:09:17 +03:00
Lauri Ojansivu c950c236ee Repair 50 Klingon account, accessibility and storage labels
Replace German-seeded account lockout, accessibility, migration and S3 storage text directly with Klingon. Keep product names and protocol syntax; preserve source interpolation tokens. Low-confidence prose remains open to fluent-speaker review.

Validation: audited correction and Klingon regressions pass.

Thanks to xet7 !
2026-09-13 17:08:44 +03:00
Lauri Ojansivu 4f1821e35f Update audit after 50 further Klingon control repairs
Record dated fix 4e1e31327, 14,558 exact corrections and 176 remaining broader Klingon findings. Original pending evidence and the apostrophe parser requirement remain unresolved.

Thanks to xet7 !
2026-09-13 17:08:15 +03:00
Lauri Ojansivu 4e1e31327b Repair 50 Klingon attachment, checklist and status labels
Replace German-seeded status, spinner, checklist, attachment and progress controls directly with Klingon. Preserve source placeholders and retain literal URL and Cc syntax. Low-confidence wording remains open to fluent-speaker review.

Validation: audited correction and Klingon regression checks pass.

Thanks to xet7 !
2026-09-13 17:08:05 +03:00
Lauri Ojansivu 10a8b3281d Update translation repair counts and record search parser constraint
Record dated fix 8a5473c35, 14,508 correction records and 226 remaining broader Klingon values. Track required apostrophe support for translated query operator names.

Thanks to xet7 !
2026-09-13 17:07:37 +03:00
Lauri Ojansivu 8a5473c35c Repair 40 Klingon search-help and report translations
Replace German-seeded search help, report headings, card sorting and swimlane controls; preserve source placeholders. Direct wording is low confidence and remains open to fluent-speaker review. Localized operator names require a separate apostrophe parser fix before replacement.

Validation: audited correction and Klingon regression checks pass.

Thanks to xet7 !
2026-09-13 17:07:27 +03:00
Lauri Ojansivu 4427bca2a8 Record Klingon calendar repairs and protect Gregorian weekday mapping
Update dated audit progress to 14,468 corrections and 266 remaining broader Klingon findings. Add a regression distinguishing Sunday from the alternate Saturday name.

Thanks to xet7 !
2026-09-13 17:06:51 +03:00
Lauri Ojansivu 669d7f01dd Repair 43 Klingon calendar and card-view translations
Replace German-seeded weekday labels, card-view headings, sorting labels and search result counts. Use the Klingon Language Institute Gregorian weekday mapping, including jaj wa' for Sunday; preserve interpolation tokens.

Source: https://www.kli.org/duolingo/say-when-an-event-was-2/

Other prose is low confidence and remains open to fluent-speaker review. Audited correction and Klingon regression checks pass.

Thanks to xet7 !
2026-09-13 17:06:36 +03:00
Lauri Ojansivu 0af4db4142 Update audit progress after 40 further Klingon repairs
Record the dated repair commit b7acf3047 and correction inventory of 14,425 values. Keep the broader Klingon review queue at 309 and distinguish it from the original 2,618 pending findings.

Thanks to xet7 !
2026-09-13 17:06:00 +03:00
Lauri Ojansivu b7acf30478 Repair 40 Klingon automation and member-control translations
Replace remaining German-seeded checklist actions, swimlane controls, assignee labels and user-management headings directly with Klingon. Preserve source placeholders and record exact before/after values. Wording is low confidence and remains open to fluent-speaker review.

Validation: Klingon translation and audited correction regressions pass.

Thanks to xet7 !
2026-09-13 17:05:48 +03:00
Lauri Ojansivu 01ec5d7aff Document executable release scripts in Upcoming changelog
Record commit 2a5a53cf6, list the five permission changes and their syntax and regression validation.

Thanks to xet7 !
2026-09-13 17:05:22 +03:00
Lauri Ojansivu 2a5a53cf64 Make five release scripts executable
Set executable permissions on apt-install.sh, delete-tag.sh, fetch.sh, fossil.sh and npm-retry.sh so they can be invoked directly. Script contents are unchanged.

Validation: Bash syntax checks and npm retry and Fossil export regression suites pass.

Thanks to xet7 !
2026-09-13 17:05:13 +03:00
Lauri Ojansivu 751310d469 Keep audit status current after 841 resumed Klingon repairs 2026-09-13 17:01:32 +03:00
Lauri Ojansivu 25e8bc4925 Repair 160 Klingon automation, notification and diagnostic labels
Replace reviewed German-seeded labels directly, preserve dynamic tokens and runtime names, and distinguish completed versus incomplete states and top versus bottom positions. Recorded corrections and Klingon regression checks pass. Low-confidence prose remains marked for fluent-speaker review.

Thanks to xet7 !
2026-09-13 17:01:32 +03:00
Lauri Ojansivu 7adcaadc1a Update resumed translation progress and record Fossil verification 2026-09-13 16:59:37 +03:00
Lauri Ojansivu fcd6936103 Repair 160 further Klingon date, filtering and member-control translations
Replace reviewed German text, distinguishing assignees from creators, archive from delete, start from due dates, and tracking from notification suppression. Preserve tokens and file formats. Recorded-correction, warning and Klingon regression checks pass. Low-confidence wording remains marked for fluent-speaker review.

Thanks to xet7 !
2026-09-13 16:59:36 +03:00
Lauri Ojansivu 35888eedf2 Expose local Fossil export and UI in both build menus
Resolve the UI repository from the script or a supplied filename, keep temporary files under the repository, and report missing files or tools clearly. Add matching menu and command-line entries on Unix and Windows, documentation, and mocked UI path checks. Menu parity and a real Fossil 2.28 history import pass.

Thanks to xet7 !
2026-09-13 16:59:04 +03:00
Lauri Ojansivu d51ea2b92a Exclude internal tree refs from local Git-to-Fossil exports
Export branch, tag and remote-branch namespaces explicitly instead of all refs. Resolve paths from the script, handle destinations with spaces, preserve existing repositories and propagate Git or Fossil failures. Reproduce the reported warning with real Git and verify a real Fossil 2.28 import preserves history and the release tag.

Thanks to xet7 !
2026-09-13 16:57:04 +03:00
Lauri Ojansivu 880c83938c Track the broader Klingon audit and its latest repair commit 2026-09-13 16:53:29 +03:00
Lauri Ojansivu 9bb5614366 Repair 160 additional German-seeded Klingon interface values
Review common board, workspace, vote and archive controls beyond the original audit queue. Preserve all source tokens and use explicit color references to distinguish hues sharing Klingon color terminology. Regression checks for correction records, warning states, JSON and placeholder inventories pass. Low-confidence language remains marked for fluent-speaker validation.

Thanks to xet7 !
2026-09-13 16:53:29 +03:00
Lauri Ojansivu 9961abbcc0 Document the private preference field that prevents impersonation profile collisions 2026-09-13 16:51:36 +03:00
Lauri Ojansivu 236095a4a4 Publish the current-user board preference independently of DDP profile merges
Meteor merges top-level profile objects by publication precedence. Publish the private boardViewPreference field reactively so a narrow or empty profile cannot hide it during impersonation. Preserve pending choices until the private preference catches up, and route the remaining calendar helper through the same resolver. Cover preference precedence, updates, unsets, deletion, observer cleanup and the real impersonation browser path.

Thanks to gleneindre and xet7 !

Fixes #6691,
2026-09-13 16:51:19 +03:00
Lauri Ojansivu 390d035a86 Record the completed original Klingon queue and broader locale review 2026-09-13 16:48:40 +03:00
Lauri Ojansivu 4c763c8c9f Finish the 361 originally flagged Klingon translation repairs
Repair the final 81 flagged strings, including calendar-system labels, storage authentication help and destructive warnings. Preserve calendar epoch and observation distinctions, invitation tokens and diagnostic commands. Placeholder and correction regressions pass. Low-confidence Klingon wording still needs fluent-speaker review; the broader locale audit continues.

Thanks to xet7 !
2026-09-13 16:48:40 +03:00
Lauri Ojansivu dfdecc6f53 Update audit progress after 280 Klingon repairs and record the awaited identity switch 2026-09-13 16:47:00 +03:00
Lauri Ojansivu d0fea765fb Repair 100 Klingon invitation, storage and interface translations
Preserve invitation tokens, search syntax, HTML structure, URL and product names, file-format properties and upload limits. Recorded-correction and Klingon regressions pass. Klingon wording remains low confidence pending fluent-speaker review.

Thanks to xet7 !
2026-09-13 16:46:59 +03:00
Lauri Ojansivu afb00d5fe7 Synchronize the impersonation regression with its deferred switch promise 2026-09-13 16:45:03 +03:00
Lauri Ojansivu 1c47bcc4ac Await the Meteor 3 subscription transition during admin impersonation
Finish setUserId before returning to the client, so subscription recreation cannot race the client identity change. Add a deferred-promise regression and verify switch failures propagate.

Thanks to gleneindre and xet7 !

Fixes #6691,
2026-09-13 16:44:49 +03:00
Lauri Ojansivu c5305eed52 Record progress after 180 resumed Klingon translation repairs 2026-09-13 16:43:03 +03:00
Lauri Ojansivu ee4d2756f3 Repair another 90 Klingon warning, permission and diagnostic translations
Replace wrong-language text directly while preserving placeholders, archive-versus-delete behavior, migration constraints and memory-metric distinctions. Klingon wording is low confidence; fluent-speaker validation remains outstanding. Recorded-correction and Klingon regression checks pass.

Thanks to xet7 !
2026-09-13 16:43:02 +03:00
Lauri Ojansivu f1411d69eb Retain the audit latest-fix marker while recording resumed repairs 2026-09-13 16:41:23 +03:00
Lauri Ojansivu c18771a1df Keep resumed audit progress and issue notes within changelog format 2026-09-13 16:41:12 +03:00
Lauri Ojansivu 17ca32a0da Repair 90 wrong-language Klingon security, activity and search translations
Keep placeholders, JSON properties and literal query examples intact. Add regression checks for destructive warnings, security states and translation records. Update the resumed audit counts. Klingon prose is low confidence and needs fluent-speaker validation.

Thanks to xet7 !
2026-09-13 16:40:32 +03:00
Lauri Ojansivu 20a46ff5ea Resume translation review and record issue 6691 regression coverage 2026-09-13 16:37:58 +03:00
Lauri Ojansivu 4a6738330a Keep swimlane scopes consistent for partial and impersonated user profiles
Resolve missing or invalid profile board views through the browser preference and Swimlanes default without reloading. Publish the authenticated user board-view preference privately, including after impersonation. Add fallback, selector-scope, publication-isolation and browser regressions.

Thanks to gleneindre and xet7 !

Fixes #6691,
2026-09-13 16:37:27 +03:00
Lauri Ojansivu 7e066fa676 Record complete matrix and harden prefixed refresh checks
Thanks to xet7 !
2026-09-13 16:33:01 +03:00
Lauri Ojansivu 2f1f1beacb Give template titles sole autofocus and wait for refreshed identity
Remove competing autofocus from the template search field and require the actual title field to retain entered text. Wait for the expected Meteor user in the browser across refresh initialization. The refresh regression passes ten WebKit repetitions without retries.

Thanks to xet7 !
2026-09-13 16:31:23 +03:00
Lauri Ojansivu 8bdd2aa4e9 Verify prefixed cookie preferences and logout in all browsers
Extend the URL-prefix regression with preference-preserving reload, actual logout, empty-cookie refresh and invalid-cookie rejection. All three browser checks pass against the current compiled source.

Thanks to xet7 !
2026-09-13 16:08:23 +03:00
Lauri Ojansivu d64a6c521b Summarize current 999-suite and prefixed browser verification
Thanks to xet7 !
2026-09-13 16:05:18 +03:00
Lauri Ojansivu 64e5023a28 Record cookie switching repair before final verification
Thanks to xet7 !
2026-09-13 16:00:48 +03:00
Lauri Ojansivu d8c3a3bb55 Wait for replacement cookie when switching browser test users
Thanks to xet7 !
2026-09-13 16:00:24 +03:00
Lauri Ojansivu 0f4d6a1660 Document prefixed cookie sessions and verification progress
Thanks to xet7 !
2026-09-13 15:58:28 +03:00
Lauri Ojansivu 4cf165ee4f Provide standard URL parsing in cookie fixture regression
Thanks to xet7 !
2026-09-13 15:57:32 +03:00
Lauri Ojansivu 2c5d483a76 Keep native cookie sessions working behind a URL prefix
Use same-origin cookie endpoints under the configured ROOT_URL path for prefixed deployments. Preserve native server validation, HttpOnly cookies, memory-only credentials and root deployment behavior. Keep browser fixture navigation under its base path.

Thanks to xet7 !
2026-09-13 15:57:23 +03:00
Lauri Ojansivu 45e654b371 Record Firefox filter-reset repair and rerun progress
Thanks to xet7 !
2026-09-13 15:47:59 +03:00
Lauri Ojansivu 9ed2fc5400 Prevent navigation when clearing board filters
Cancel the header reset link default action before resetting the filter. Require the reset control and assert the document and board remain mounted while the label query is removed.

Thanks to xet7 !
2026-09-13 15:47:06 +03:00
Lauri Ojansivu 9116303d27 Record cookie fixture and browser verification repairs
Thanks to xet7 !
2026-09-13 15:32:05 +03:00
Lauri Ojansivu 00073c3f5f Wait for cookie resume and verify voting and board actions
Avoid a second token login while cookie retrieval is still pending. Exercise voting persistence, board title editing and the member archive menu through the current UI.

Thanks to xet7 !
2026-09-13 15:31:52 +03:00
Lauri Ojansivu 7d74f78e30 Record current Node and compiled browser verification in the paused audit 2026-09-13 15:21:25 +03:00
Lauri Ojansivu fdf50e9038 Record template and calendar repairs with current verification progress 2026-09-13 15:14:01 +03:00
Lauri Ojansivu 535ed5f4e9 Verify template instantiation honors the list top position 2026-09-13 15:13:28 +03:00
Lauri Ojansivu 8c96ac84f4 Import filter and routing APIs in the multi-board calendar 2026-09-13 15:13:09 +03:00
Lauri Ojansivu 1e328a98de Copy rendered template cards without submitting runtime ID caches 2026-09-13 15:11:56 +03:00
Lauri Ojansivu cb54293f98 Document restored checklist close control coverage 2026-09-13 15:05:55 +03:00
Lauri Ojansivu ddb43f09fe Run checklist close guards on an active card route 2026-09-13 15:02:41 +03:00
Lauri Ojansivu 367de94363 Document current Chrome discovery regression coverage 2026-09-13 14:58:16 +03:00
Lauri Ojansivu 98d473caf1 Find ARM64 Chrome in current Playwright images 2026-09-13 14:58:04 +03:00
Lauri Ojansivu 6ff547c5da Document test server process ownership regression checks 2026-09-13 14:53:27 +03:00
Lauri Ojansivu ebd45deb13 Record actual test server processes for reliable cleanup 2026-09-13 14:53:27 +03:00
Lauri Ojansivu 2195413d28 Document board query navigation repair and regression coverage 2026-09-13 14:51:35 +03:00
Lauri Ojansivu 9b2ff6136c Verify filter URL updates preserve the board and sidebar 2026-09-13 14:50:55 +03:00
Lauri Ojansivu c1714d26ea Keep the board mounted when filter query parameters change 2026-09-13 14:50:43 +03:00
Lauri Ojansivu 77988d4a66 Document database coverage and registered vet regression checks 2026-09-13 14:43:23 +03:00
Lauri Ojansivu db6a92336f Fail database conformance when a backend or source build cannot run 2026-09-13 14:43:07 +03:00
Lauri Ojansivu 56b8e5a273 Document calendar theme and browser availability regressions 2026-09-13 14:40:15 +03:00
Lauri Ojansivu 0cf8f15403 Verify calendar labels only for options supported by each browser 2026-09-13 14:39:31 +03:00
Lauri Ojansivu 3b84364483 Theme calendar navigation and day buttons with the same rules as Save 2026-09-13 14:37:08 +03:00
Lauri Ojansivu 1040816169 Record EVERYTHING test repairs and ongoing matrix verification 2026-09-13 14:33:09 +03:00
Lauri Ojansivu 37043149f5 Apply selected month views to the multi-board calendar and document grid alignment 2026-09-13 14:31:56 +03:00
Lauri Ojansivu 71b77aedad Align selected-calendar month grids with the configured week start 2026-09-13 14:30:53 +03:00
Lauri Ojansivu 9c7c14d3ff Use actual selected-calendar month ranges in grid and list views 2026-09-13 14:29:42 +03:00
Lauri Ojansivu c667aab276 Use current test dependencies for every browser route and seed timer defaults 2026-09-13 14:25:44 +03:00
Lauri Ojansivu 39b3be22e5 Seed enabled card section defaults in browser fixtures 2026-09-13 14:24:26 +03:00
Lauri Ojansivu 1d3c9b5cc0 Exercise visible calendar controls instead of hidden date fields in browser tests 2026-09-13 14:23:02 +03:00
Lauri Ojansivu 51a7f12892 Keep reactive filter clicks inside the sidebar and align browser regression fixtures 2026-09-13 14:21:31 +03:00
Lauri Ojansivu 9e0f75f5a7 Refresh browser test dependencies and repair the attachment viewer regression selector 2026-09-13 14:18:36 +03:00
Lauri Ojansivu cb9b689a6e Protect launcher ancestors during EVERYTHING process cleanup
Exclude launcher and ancestor PIDs before expanding abandoned test process trees. A shell command containing the test invocation must not terminate its own parent. Regression checks preserve cleanup of unrelated old tests without signalling real processes.
2026-09-13 14:10:48 +03:00
Lauri Ojansivu 43f2e2be3e Record passing Node regression run and retained translation pause 2026-09-13 14:07:41 +03:00
Lauri Ojansivu c3d87894ca Cover RTL date popup positioning and dragging in browser regression 2026-09-13 14:06:47 +03:00
Lauri Ojansivu 8ae15efffb Fix Node suite failures after calendar and translation updates
Restore backend configuration parity, resolve static calendar enum imports in OpenAPI generation, and parse Unicode property escapes without executing JavaScript. Preserve logical popup anchors and physical dragging. Protect reviewed source terms during filling, restore native examples and labels, and update stale guards while retaining the explicit unresolved Sardinian review. Add enum, dragging and filling regression coverage.
2026-09-13 14:06:01 +03:00
Lauri Ojansivu bc3a7f832f Pause translation repairs and summarize unreleased changes
Record the dated pause and remaining translation validation in the short audit and TODO Later. Group all unreleased calendar, OAuth2, translation and maintainer-tool changes since v11.72, including Playwright and repository mirror updates. Preserve released sections and record the full coverage audit and outstanding checks.
2026-09-13 13:58:03 +03:00
Lauri Ojansivu 1843fc94ef Record account translation repair progress 2026-09-13 13:52:07 +03:00
Lauri Ojansivu f6e2f742c2 Translate Klingon account and administrator messages
Preserve activation states, opposite click actions, required administrator and team creation contact. Complete software wording is low confidence and requires fluent-speaker review.
2026-09-13 13:51:57 +03:00
Lauri Ojansivu 1a0a08f6ca Record keyboard shortcut translation progress 2026-09-13 13:51:20 +03:00
Lauri Ojansivu 8d60a52c14 Translate Klingon keyboard shortcut messages
Preserve enabled and disabled states and the opposite click actions. Keyboard noun is attested; assembled shortcut wording is low confidence and requires fluent-speaker review.
2026-09-13 13:51:12 +03:00
Lauri Ojansivu 2531114b9d Record checklist text conversion translation progress 2026-09-13 13:50:38 +03:00
Lauri Ojansivu d9d99266b2 Translate Klingon checklist text conversion instructions
Preserve conversion of each text line into one checklist item and the original-order variant. Text-line terminology and assembled phrases are low confidence and need fluent-speaker review.
2026-09-13 13:50:30 +03:00
Lauri Ojansivu 4d2ce9c168 Record checklist visibility translation progress 2026-09-13 13:49:57 +03:00
Lauri Ojansivu edb82b7e1c Translate Klingon checklist visibility and list cleanup messages
Preserve all versus completed checklist items and duplicate-empty list conditions. Complete software phrasing is low confidence and requires fluent-speaker review.
2026-09-13 13:49:50 +03:00
Lauri Ojansivu 14804a511d Record upload translation repair progress 2026-09-13 13:49:13 +03:00
Lauri Ojansivu db6080e2c7 Translate Klingon upload and loading messages
Replace nine foreign-language transfer labels and status messages. Preserve ongoing, failed and completed states. Software terminology is low confidence and requires fluent-speaker review.
2026-09-13 13:49:04 +03:00
Lauri Ojansivu bbeefbe9be Record monitoring translation repair progress 2026-09-13 13:48:28 +03:00
Lauri Ojansivu 8a1c22bf1d Translate Klingon monitoring and refresh messages
Replace four German monitoring and refresh strings with Klingon. Software metaphors and complete wording are low confidence and require fluent-speaker review.
2026-09-13 13:48:27 +03:00
Lauri Ojansivu 797103d735 Shorten translation audit progress summary 2026-09-13 13:47:43 +03:00
Lauri Ojansivu 29408a8634 Update WeKan repo mirror script.
Thanks to providers of mirrors !
2026-09-13 13:45:48 +03:00
Lauri Ojansivu 507ea11e5d Record Klingon movement activity translation progress 2026-09-13 13:42:18 +03:00
Lauri Ojansivu 8dcef884a5 Translate Klingon movement and membership activity fragments
Preserve movement and import argument order, source/destination roles, creation, addition and joining. Verify substitutions against activity templates. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:42:10 +03:00
Lauri Ojansivu 2b90cdcd6e Record Klingon description translation progress 2026-09-13 13:41:08 +03:00
Lauri Ojansivu 267f3a4be1 Translate Klingon description and duplicate-list controls
Preserve additional description detail, unsaved description and deletion of duplicate empty lists. Reuse repaired description terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:41:00 +03:00
Lauri Ojansivu e9ae623464 Record Klingon authorization translation progress 2026-09-13 13:39:57 +03:00
Lauri Ojansivu 499144d2c5 Translate Klingon authorization and invitation errors
Preserve board role requirements, page-view permission, self-invitation prevention and invitation-code/schema checks. Reuse repaired terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:39:51 +03:00
Lauri Ojansivu 35e88ea9dc Record Klingon validation error translation progress 2026-09-13 13:38:47 +03:00
Lauri Ojansivu 0bb208c5ea Translate Klingon existence and validation errors
Preserve object identity, duplicate organization/team names, account creation, login attempt and malformed JSON meanings. Reuse repaired terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:38:38 +03:00
Lauri Ojansivu 79dda703b1 Record Klingon checklist completion translation progress 2026-09-13 13:37:41 +03:00
Lauri Ojansivu 7a636ea2e4 Translate Klingon checklist completion messages
Preserve completed and incomplete status, deletion confirmation, placeholder roles and comma-separated checklist instructions. Reuse existing checklist terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:37:34 +03:00
Lauri Ojansivu 4051054c58 Record Klingon organization translation progress 2026-09-13 13:36:40 +03:00
Lauri Ojansivu 3325e7d2be Translate Klingon organization and team controls
Preserve organization/team counts, edit titles and contact-administrator instruction. Reuse repaired terminology and source count-label spacing. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:36:31 +03:00
Lauri Ojansivu ed1cffe71c Record Klingon migration translation progress 2026-09-13 13:35:24 +03:00
Lauri Ojansivu 613b7dd9e0 Translate Klingon migration state messages
Preserve migration operation distinctions, success and failure, completion and stopping all migrations. Use descriptive data-changing task terminology. Assembled technical wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:35:16 +03:00
Lauri Ojansivu a0952334c2 Record Klingon scheduled-job translation progress 2026-09-13 13:34:22 +03:00
Lauri Ojansivu 6b0457aada Translate Klingon scheduled-job state controls
Preserve pause, resume and start distinctions, operation success or failure, and deletion confirmation. Reuse scheduled-task terminology and attested verbs. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:34:12 +03:00
Lauri Ojansivu d79fa90630 Record Klingon date activity translation progress 2026-09-13 13:32:55 +03:00
Lauri Ojansivu e00ede77d2 Translate Klingon date activities and restore format notation
Preserve formatted-date then card-link substitution order and distinguish start, received, due and end dates. Restore exact technical format labels. Assembled date wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:32:47 +03:00
Lauri Ojansivu 44654feb0d Record Klingon checklist activity translation progress 2026-09-13 13:31:52 +03:00
Lauri Ojansivu f2923f46d8 Translate Klingon checklist and custom-field activities
Preserve checklist item addition/removal and field-name/card-link substitution order. Describe custom-field unsetting as removing stored data, matching the card update hook. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:31:44 +03:00
Lauri Ojansivu 2d14d171b3 Record Klingon watching translation progress 2026-09-13 13:30:43 +03:00
Lauri Ojansivu 3234e9062c Translate Klingon watching and activity notification messages
Preserve watching scope, administrator disabling, creation-time watching and change notifications. Keep attachment deletion distinct from checklist removal. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:30:37 +03:00
Lauri Ojansivu 6769158b7b Record Klingon export translation progress 2026-09-13 13:29:37 +03:00
Lauri Ojansivu af9c8bc7bf Translate Klingon Excel and monitoring export controls
Preserve export format, field inclusion, board/card identity and export inability or failure. Reuse repaired export terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:29:30 +03:00
Lauri Ojansivu a6d5317841 Record Klingon add and remove translation progress 2026-09-13 13:28:36 +03:00
Lauri Ojansivu 5c36b83811 Translate Klingon add and remove controls
Preserve list placement, checklist and scheduled-job addition, cover-image changes and team/organization removal confirmations. Reuse repaired terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:28:30 +03:00
Lauri Ojansivu 91d3eca6ce Record Klingon account validation translation progress 2026-09-13 13:27:39 +03:00
Lauri Ojansivu 433fb2dce7 Translate Klingon account validation and name labels
Preserve duplicate account fields, required credentials and minimum three username characters with additional characters allowed. Reuse repaired terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:27:31 +03:00
Lauri Ojansivu 7e54745850 Record Klingon SMTP translation progress 2026-09-13 13:26:36 +03:00
Lauri Ojansivu b86fef0276 Translate Klingon SMTP settings descriptions and labels
Preserve host address, outbound connection port, TLS enabling and username meanings. Keep protocol identifiers recognizable. Assembled technical wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:26:25 +03:00
Lauri Ojansivu 192738ba25 Record Klingon account email translation progress 2026-09-13 13:25:39 +03:00
Lauri Ojansivu 15ef356a37 Translate Klingon account email bodies and subjects
Preserve enrollment, reset and verification actions, exact placeholders and paragraph breaks. Reuse password and message terminology with descriptive link/address metaphors. Assembled wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:25:33 +03:00
Lauri Ojansivu 0b8259eed1 Record Klingon email translation progress 2026-09-13 13:24:25 +03:00
Lauri Ojansivu 8c5b09b8bf Translate Klingon storage confirmation and email messages
Preserve S3 save completion, test-email recipient, invitation actor and account enrollment site. Reuse repaired terminology and exact source placeholders. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:24:17 +03:00
Lauri Ojansivu e63b3ad317 Record Klingon list action translation progress 2026-09-13 13:23:21 +03:00
Lauri Ojansivu c619e961d5 Translate Klingon list and card action controls
Preserve all-card list scope, single additions and Trello import source. Reuse repaired movement, selection and import terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:23:14 +03:00
Lauri Ojansivu 5686c3ae0d Record Klingon permission translation progress 2026-09-13 13:22:27 +03:00
Lauri Ojansivu b6f4a1e7fe Translate Klingon read and comment permissions
Preserve assigned-card visibility, comment-only and read-only capabilities, editing restrictions and hidden comments. Reuse repaired terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:22:19 +03:00
Lauri Ojansivu 8e34b2956b Record Klingon lookup translation progress 2026-09-13 13:21:28 +03:00
Lauri Ojansivu ef6450570b Translate Klingon lookup and save failure messages
Preserve lookup identities, comment containment, scheduled-job deletion and S3 configuration saving. Reuse repaired terminology and source percent tokens. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:21:22 +03:00
Lauri Ojansivu 9b8a0eb5ac Record Klingon starred-board translation progress 2026-09-13 13:20:37 +03:00
Lauri Ojansivu 51735012ea Translate Klingon starred-board controls
Preserve star-marker actions, count and top-of-list display. Replace German labels using a descriptive star-label metaphor. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:20:30 +03:00
Lauri Ojansivu 2ccb3f6c62 Record Klingon card window translation progress 2026-09-13 13:19:30 +03:00
Lauri Ojansivu c48c9984cc Translate Klingon card window and checklist form controls
Preserve multiple-card window behavior, add/edit form closure and the missing-board placeholder. Reuse existing terminology with descriptive software window and form metaphors. Assembled wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:19:22 +03:00
Lauri Ojansivu df3b0eac40 Record Klingon permanent deletion translation progress 2026-09-13 13:18:18 +03:00
Lauri Ojansivu 1b41036ba3 Translate Klingon permanent deletion warnings
Preserve permanent deletion, label history loss, card activity loss and all-notification confirmation. Reuse descriptive original-state restoration wording. Assembled software phrasing is low confidence and needs fluent-speaker validation.
2026-09-13 13:18:09 +03:00
Lauri Ojansivu 0b5f0e303d Record Klingon deletion warning translation progress 2026-09-13 13:17:13 +03:00
Lauri Ojansivu 69b5875476 Translate Klingon card membership and deletion warnings
Preserve member addition/removal, comment counts, irreversible deletion confirmations and existing-user restrictions. Describe restoring the original state for undo warnings. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:17:07 +03:00
Lauri Ojansivu 84d37ee41b Record Klingon label translation progress 2026-09-13 13:16:13 +03:00
Lauri Ojansivu 999a94f737 Translate Klingon label and membership display controls
Preserve label actions and label/card substitution order, plus added-team and organization display position. Reuse existing terminology and plural indefinite agreement. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:16:07 +03:00
Lauri Ojansivu fef0278d97 Record Klingon visibility translation progress 2026-09-13 13:15:05 +03:00
Lauri Ojansivu cecb82598b Translate Klingon visibility and week-number controls
Preserve each control scope and the ISO 8601 reference. Reuse existing card, list, member and image terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:15:01 +03:00
Lauri Ojansivu 1cf23b6043 Record Klingon search translation progress 2026-09-13 13:14:21 +03:00
Lauri Ojansivu bd275b310b Translate Klingon search sorting instructions and errors
Preserve executable sorting syntax, descending order and number/value placeholder roles. Replace four German search messages. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:14:16 +03:00
Lauri Ojansivu 28e6bae16f Record Klingon attachment translation progress 2026-09-13 13:13:22 +03:00
Lauri Ojansivu 1172b87517 Translate Klingon attachment storage controls
Preserve storage destinations and singular, board-wide and global movement scopes. Reuse attachment terminology and retain technical backend names. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:13:15 +03:00
Lauri Ojansivu a71b775d1b Record Klingon filter translation progress 2026-09-13 13:12:05 +03:00
Lauri Ojansivu 6c03603472 Translate Klingon filter status and personal card controls
Preserve filter criteria, click-to-edit instructions, assignment to me and personal ownership. Clearing removes filter criteria. Assembled software phrasing is low confidence and needs fluent-speaker validation.
2026-09-13 13:11:57 +03:00
Lauri Ojansivu 8948f97bd3 Record Klingon subtask and sorting translation progress 2026-09-13 13:11:03 +03:00
Lauri Ojansivu ba42d1014d Translate Klingon subtask destinations and export controls
Replace five audited German controls, preserving destination, confirmation and inability to export. Correct plural indefinite-subject agreement in both numeric card-sorting labels according to Klingon Language Institute guidance. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:10:58 +03:00
Lauri Ojansivu 95c1529827 Record Klingon comment translation progress 2026-09-13 13:09:56 +03:00
Lauri Ojansivu 494ed5d0f6 Translate Klingon comment activities and controls
Reuse existing small-message terminology for comments and preserve addition, editing and deletion distinctions. Verify comment text substitution against the activity template. Assembled wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:09:49 +03:00
Lauri Ojansivu ca4709d295 Record Klingon import and movement translation progress 2026-09-13 13:08:50 +03:00
Lauri Ojansivu 2aa937a036 Translate Klingon import and card movement activities
Preserve import destinations and every old/new movement context placeholder; align duplicate label-removal wording. The import metaphor and assembled movement phrases are low confidence and need fluent-speaker validation.
2026-09-13 13:08:42 +03:00
Lauri Ojansivu a79c09426d Record Klingon membership translation progress 2026-09-13 13:07:30 +03:00
Lauri Ojansivu ce33d3d37f Translate Klingon membership and checklist removal activities
Preserve member addition versus removal and the exact checklist placeholder capitalization. Reuse card and checklist terminology. Assembled software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:07:25 +03:00
Lauri Ojansivu bc44429ddd Record Klingon activity translation progress 2026-09-13 13:06:29 +03:00
Lauri Ojansivu ff1d126b60 Translate Klingon addition and removal activities
Replace nine German activity messages while preserving placeholder roles, board context, and addition versus deletion or removal. Reuse existing card, checklist, attachment and label terms. Assembled wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:06:24 +03:00
Lauri Ojansivu 3b40f7ea45 Record Klingon account and login translation progress 2026-09-13 13:05:27 +03:00
Lauri Ojansivu bf9b04829b Translate Klingon account creation and login controls
Preserve existing-account prompts, account creation success and failure, and the ability to log in after creation. Reuse the account borrowing. Software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:05:17 +03:00
Lauri Ojansivu 800ad5e7d6 Record Klingon notification and account translation progress 2026-09-13 13:04:20 +03:00
Lauri Ojansivu 4613a63b77 Translate Klingon account self-deletion permission
Preserve permission for the user to delete their own account. The account borrowing follows existing controls; the assembled wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:04:16 +03:00
Lauri Ojansivu e981bc8a49 Translate Klingon notification controls
Replace German and French notification labels and retain deletion of all notification messages. Descriptive software wording is low confidence and needs fluent-speaker validation.
2026-09-13 13:03:54 +03:00
Lauri Ojansivu e2dab89295 Record Klingon filter translation progress 2026-09-13 13:01:13 +03:00
Lauri Ojansivu d864cbce86 Translate Klingon filter and subtask-field controls
Preserve filter criteria and object distinctions. Full software wording remains low confidence and requires fluent-speaker validation.
2026-09-13 13:00:58 +03:00
Lauri Ojansivu 74188d1cf8 Record Klingon alphabetical-label translation progress 2026-09-13 13:00:27 +03:00
Lauri Ojansivu 1b3e0dfa1a Translate Klingon title and alphabetical-order labels 2026-09-13 13:00:18 +03:00
Lauri Ojansivu 8104312987 Record Klingon sorting translation progress 2026-09-13 12:59:28 +03:00
Lauri Ojansivu 1d30021614 Correct subject prefix in Klingon sort shortcut 2026-09-13 12:59:18 +03:00
Lauri Ojansivu 6b5b0a722f Translate Klingon sorting controls
Use the attested sorting verb with list items as its object. Full UI phrases remain low confidence and need fluent-speaker validation.
2026-09-13 12:59:03 +03:00
Lauri Ojansivu f37e6ef066 Record Klingon layout translation progress 2026-09-13 12:58:15 +03:00
Lauri Ojansivu ec011c3622 Translate Klingon swimlane layout controls
Replace three flagged German controls using descriptive height wording and preserve add-below direction. Full phrases remain low confidence and require fluent-speaker validation.
2026-09-13 12:58:07 +03:00
Lauri Ojansivu e81ae90cf1 Record Klingon sidebar translation progress 2026-09-13 12:57:22 +03:00
Lauri Ojansivu 9390995857 Translate Klingon sidebar shortcut labels
Replace three flagged German labels and distinguish search, board and filter panels. Software descriptions remain low confidence and require fluent-speaker validation.
2026-09-13 12:57:12 +03:00
Lauri Ojansivu e600fc07ae Record Klingon selection translation progress 2026-09-13 12:56:37 +03:00
Lauri Ojansivu 9204275316 Translate Klingon selection and read controls
Replace three flagged German controls using existing vocabulary. Full constructions remain low confidence and require fluent-speaker validation.
2026-09-13 12:56:27 +03:00
Lauri Ojansivu 7bea1b0724 Record Klingon formatting translation progress 2026-09-13 12:55:43 +03:00
Lauri Ojansivu 24d6321d9e Translate Klingon formatting and card display labels
Replace three flagged German strings while retaining markdown. Descriptive software terminology and full phrases remain low confidence and need fluent-speaker validation.
2026-09-13 12:55:34 +03:00
Lauri Ojansivu 7a79b46778 Record Klingon transfer translation progress 2026-09-13 12:54:59 +03:00
Lauri Ojansivu b8aa21bbe5 Translate Klingon export and transfer failures
Replace three flagged German labels while retaining PDF and S3. Full software phrases remain low confidence and require fluent-speaker validation.
2026-09-13 12:54:49 +03:00
Lauri Ojansivu b3ea285f0d Record Klingon checklist-item translation progress 2026-09-13 12:54:13 +03:00
Lauri Ojansivu 1cf58d4d52 Translate Klingon checklist-item controls and example
Replace three flagged German strings while preserving the deletion question and comma-separated example. Full phrases remain low confidence and need fluent-speaker validation.
2026-09-13 12:54:03 +03:00
Lauri Ojansivu e1509f89bd Clarify checklist repair batch count 2026-09-13 12:53:28 +03:00
Lauri Ojansivu 7d9bf4692b Record Klingon checklist translation progress 2026-09-13 12:53:22 +03:00
Lauri Ojansivu 10a847efb9 Translate Klingon checklist labels and activity
Replace four labels using existing checklist wording and preserve the activity destination placeholder. Descriptive terminology and full phrases remain low confidence and need fluent-speaker validation.
2026-09-13 12:53:13 +03:00
Lauri Ojansivu 71bc1a74d1 Record Klingon field-control translation progress 2026-09-13 12:52:39 +03:00
Lauri Ojansivu cbaca1079e Translate Klingon custom-field controls
Replace four flagged German controls while preserving deletion, display, all-card and new-card distinctions. Full phrases remain low confidence and require fluent-speaker validation.
2026-09-13 12:52:29 +03:00
Lauri Ojansivu 870212c7c8 Record Klingon custom-field translation progress 2026-09-13 12:51:57 +03:00
Lauri Ojansivu 12552afa83 Translate Klingon custom-field labels
Use descriptive user-configured data-field wording consistently across four labels. Software terminology and full clauses remain low confidence and require fluent-speaker validation.
2026-09-13 12:51:47 +03:00
Lauri Ojansivu ea8327b613 Record Klingon missing-item translation progress 2026-09-13 12:51:07 +03:00
Lauri Ojansivu 5f24d549a4 Translate Klingon missing-item messages and team labels
Replace five German/French labels and preserve the missing-name placeholder roles. Assembled software phrases remain low confidence and need fluent-speaker validation.
2026-09-13 12:50:58 +03:00
Lauri Ojansivu beaeecf1ae Record Klingon subtask translation repair progress 2026-09-13 12:50:18 +03:00
Lauri Ojansivu 3c57568240 Translate Klingon subtask labels consistently
Replace six German labels, preserving the deletion question. Software hierarchy terminology and assembled phrases remain low confidence and require fluent-speaker validation.
2026-09-13 12:50:02 +03:00
Lauri Ojansivu 153d06b7f9 Record Klingon activity translation repair progress 2026-09-13 12:49:21 +03:00
Lauri Ojansivu b318e634a9 Translate Klingon attachment and membership activity messages
Replace four flagged German messages and preserve placeholder roles. Software constructions and the subtask term remain low confidence and require fluent-speaker validation.
2026-09-13 12:49:12 +03:00
Lauri Ojansivu 1b93a3a76b Record Klingon display translation repair progress 2026-09-13 12:48:38 +03:00
Lauri Ojansivu 76323796cd Translate Klingon background and list display actions
Replace five flagged German labels using existing vocabulary. Assembled UI phrases are low confidence and require fluent-speaker validation.
2026-09-13 12:48:29 +03:00
Lauri Ojansivu 9a12a984de Record Klingon card and attachment translation progress 2026-09-13 12:47:55 +03:00
Lauri Ojansivu 033c374e5e Translate Klingon card and attachment settings
Replace seven German labels using existing card and attachment terms. Software compounds and full phrases remain low confidence and need fluent-speaker validation.
2026-09-13 12:47:46 +03:00
Lauri Ojansivu a0695653ee Record Klingon settings translation progress 2026-09-13 12:47:06 +03:00
Lauri Ojansivu fcf9be87d6 Translate Klingon settings labels consistently
Replace ten German labels with direct configuration-data wording, retaining S3 and existing workspace, board and organization terms. Full phrases remain low confidence and require fluent-speaker validation.
2026-09-13 12:46:57 +03:00
Lauri Ojansivu 2104d8b6db Record Klingon webhook translation progress 2026-09-13 12:46:24 +03:00
Lauri Ojansivu 7a875b0d23 Translate Klingon webhook action and direction labels
Replace German labels and a French title, retaining the webhook technical term. Assembled phrases and borrowing inflection are low confidence and require fluent-speaker validation.
2026-09-13 12:46:15 +03:00
Lauri Ojansivu afccdd3b65 Record Klingon password translation repairs 2026-09-13 12:45:42 +03:00
Lauri Ojansivu 51a648ed2b Translate Klingon password and diagnostic labels
Replace six German labels, including unflagged password strings. Assembled software phrases remain low confidence and require fluent-speaker validation.
2026-09-13 12:45:33 +03:00
Lauri Ojansivu 8a945fb24b Update audit after Klingon account translation repairs 2026-09-13 12:45:02 +03:00
Lauri Ojansivu b3d5fa6988 Replace German account and error labels in Klingon
Translate username change, password mismatch and generic failure directly. Assembled software phrases are low confidence and require fluent-speaker validation.
2026-09-13 12:44:53 +03:00
Lauri Ojansivu aa90523be1 Record Sesotho calendar repair progress 2026-09-13 12:44:02 +03:00
Lauri Ojansivu 50d414c190 Translate Sesotho astronomical Hijri calendar label
Keep the tabular calculation and astronomical starting-date distinctions. Assembled phrase requires native-speaker validation and is recorded as low confidence.
2026-09-13 12:43:54 +03:00
Lauri Ojansivu 8c5fe2f47d Record Setswana calendar repair progress 2026-09-13 12:43:16 +03:00
Lauri Ojansivu d99b024294 Translate Setswana tabular Hijri calendar labels
Preserve civil versus astronomical starting-date distinctions. Full phrases and calendar-domain terminology require native-speaker review and are recorded as low confidence.
2026-09-13 12:43:08 +03:00
Lauri Ojansivu 1a3c1b293c Record Chichewa calendar translation progress 2026-09-13 12:42:26 +03:00
Lauri Ojansivu 2044c8a266 Translate Chichewa civil Hijri calendar label
Reuse existing calendar terminology. The civil-domain wording is low confidence and requires native-speaker validation.
2026-09-13 12:42:17 +03:00
Lauri Ojansivu c227bd4625 Update audit after Northern Sami calendar repairs 2026-09-13 12:41:36 +03:00
Lauri Ojansivu cb71629e40 Translate Northern Sami Hijri calendar variants
Replace three English labels while preserving the calendar distinctions. Full phrases and the starting-date compound need native-speaker validation and are recorded as low confidence.
2026-09-13 12:41:25 +03:00
Lauri Ojansivu 8ddd841d7e Record Sardinian translation repair progress 2026-09-13 12:40:31 +03:00
Lauri Ojansivu 8d8072ad78 Correct Sardinian workspace and remaining time labels 2026-09-13 12:40:20 +03:00
Lauri Ojansivu 3b00c7b120 Review Sardinian computer terminology and refresh audit progress 2026-09-13 12:39:28 +03:00
Lauri Ojansivu 1a7c147983 Record Sardinian chart translation repair progress 2026-09-13 12:36:58 +03:00
Lauri Ojansivu f42bab7f5b Localize Sardinian work progress chart labels
Use existing work, remaining and completed terminology, retaining chart identifiers. Assembled labels need native-speaker validation.
2026-09-13 12:36:57 +03:00
Lauri Ojansivu fa2f08edbd Record Cornish flagged queue progress and validation limits 2026-09-13 12:36:10 +03:00
Lauri Ojansivu 2b2f08df94 Repair Cornish Hijri calendar variant labels
Restore tabular and civil versus astronomical starting-date distinctions. Technical phrasing remains low confidence and needs native validation.
2026-09-13 12:36:09 +03:00
Lauri Ojansivu 51e7545256 Record Cornish Coptic translation repair progress 2026-09-13 12:35:28 +03:00
Lauri Ojansivu 95236d91aa Translate Cornish Coptic calendar label
Follow existing calendar and adjective terminology. Coptic adjective is low confidence and requires native-speaker validation.
2026-09-13 12:35:27 +03:00
Lauri Ojansivu 8852a58270 Record Hawaiian flagged queue progress and validation limits 2026-09-13 12:34:41 +03:00
Lauri Ojansivu 890d04d343 Repair Hawaiian calendar translation labels
Restore omitted tabular, epoch and sighting distinctions. Scientific noun combinations and Coptic rendering remain low confidence.
2026-09-13 12:34:40 +03:00
Lauri Ojansivu 0c0f3b0bf5 Record Kashubian flagged queue progress and validation limits 2026-09-13 12:33:54 +03:00
Lauri Ojansivu 3add87fdab Repair Kashubian Hijri calendar variant labels
Restore tabular, epoch and sighting distinctions. Assembled scientific wording remains low confidence and needs native-speaker validation.
2026-09-13 12:33:53 +03:00
Lauri Ojansivu 87b0ffb21b Record Kashubian calendar translation repair progress 2026-09-13 12:33:15 +03:00
Lauri Ojansivu bc2f3ba1bf Translate four Kashubian calendar labels
Replace English names following existing calendar terminology; preserve Amete Alem. Adjective renderings remain low confidence and need native validation.
2026-09-13 12:33:14 +03:00
Lauri Ojansivu acdf35b01b Record Buryat flagged queue progress and validation limits 2026-09-13 12:32:12 +03:00
Lauri Ojansivu 3678e27372 Repair Buryat Hijri calendar variant translations
Restore omitted tabular, epoch and sighting distinctions. Direct scientific wording and name renderings remain low confidence and need native review.
2026-09-13 12:32:12 +03:00
Lauri Ojansivu 392458188d Record Buryat calendar translation repair progress 2026-09-13 12:31:23 +03:00
Lauri Ojansivu 8f95ba52f1 Repair four Buryat calendar translation labels
Replace Turkish and English text with direct Buryat wording following local calendar terminology. Name renderings and assembled phrases remain low confidence.
2026-09-13 12:31:22 +03:00
Lauri Ojansivu 7c0249def4 Record Volapük flagged queue progress and validation limits 2026-09-13 12:30:43 +03:00
Lauri Ojansivu bdaa51d424 Repair Volapük Hijri sighting calendar label
Restore sighting distinction with dictionary-supported observation term. Country proper name retained; complete phrase needs native validation.
2026-09-13 12:30:42 +03:00
Lauri Ojansivu 4dfb0318c6 Record scrollbar translation repair progress 2026-09-13 12:29:57 +03:00
Lauri Ojansivu d7168ebc6e Translate vertical scrollbar option into Volapük
Replace French label with descriptive dictionary-based wording. Scrollbar adaptation remains low confidence and needs native review.
2026-09-13 12:29:56 +03:00
Lauri Ojansivu 009e683df3 Record advanced filter translation repair progress 2026-09-13 12:29:13 +03:00
Lauri Ojansivu 3d3468ad36 Translate Volapük advanced filter help and repair escapes
Preserve operators, regex and literal examples, correcting doubled backslashes. Assembled prose remains low confidence and requires native review.
2026-09-13 12:29:13 +03:00
Lauri Ojansivu 5c841d7802 Record display mode translation repair progress 2026-09-13 12:28:21 +03:00
Lauri Ojansivu ac31895246 Repair Volapük display mode translations
Replace three French labels consistently, including two unflagged strings. Assembled wording and software borrowings remain low confidence.
2026-09-13 12:28:20 +03:00
Lauri Ojansivu 5017e75925 Record Japanese calendar translation repair progress 2026-09-13 12:27:45 +03:00
Lauri Ojansivu 9866ec1098 Translate Japanese calendar label into Volapük
Use attested Yapänik adjective; failed dictionary lookup did not establish invalidity. Full label needs native-speaker validation.
2026-09-13 12:27:45 +03:00
Lauri Ojansivu 156b0e1105 Update audit progress for Hijri variant translations 2026-09-13 12:27:09 +03:00
Lauri Ojansivu 22d2f5fe93 Repair Volapük Hijri calendar variant labels
Restore tabular and civil versus astronomical epoch distinctions. Preserve proper variant names. Assembled technical labels remain low confidence.
2026-09-13 12:27:08 +03:00
Lauri Ojansivu 9ddb860233 Update audit for recovery and repository translation repairs 2026-09-13 12:26:27 +03:00
Lauri Ojansivu 4b75fe8dfa Repair Volapük recovery and repository translations
Replace nine French labels, including related unflagged strings. Repository borrowing and orphan metaphor remain low confidence; native review required.
2026-09-13 12:26:26 +03:00
Lauri Ojansivu 7212c942ba Record Buddhist Coptic and Minguo translation progress 2026-09-13 12:25:49 +03:00
Lauri Ojansivu 8fe98ec4f8 Translate Volapük Buddhist Coptic and Minguo calendars
Use attested Buddhist adjective and Copt noun; preserve Minguo calendar name. Assembled labels need native-speaker validation.
2026-09-13 12:25:48 +03:00
Lauri Ojansivu f487627459 Record drag handle and storage translation progress 2026-09-13 12:25:15 +03:00
Lauri Ojansivu 1eecc60b82 Repair Volapük drag handle and storage engine labels
Replace French text with dictionary-based software wording. Handle adaptation and technical borrowings remain low confidence.
2026-09-13 12:25:14 +03:00
Lauri Ojansivu a44f78c6c5 Update translation audit for calendar country labels 2026-09-13 12:24:23 +03:00
Lauri Ojansivu 04f0ca1050 Translate Volapük Ethiopian and Indian calendar labels
Use dictionary-attested country adjectives and national terminology. Preserve Amete Alem variant name; full phrases still need native-speaker review.
2026-09-13 12:24:22 +03:00
Lauri Ojansivu 36f8ddd5a7 Record remaining Node memory translation repairs 2026-09-13 12:23:42 +03:00
Lauri Ojansivu c6df696612 Repair remaining Volapük Node memory statistic labels
Replace eleven French labels while retaining technical metric names and distinctions. Assembled software phrasing remains low confidence and needs native-speaker review.
2026-09-13 12:23:41 +03:00
Lauri Ojansivu 24207d3d7c Update audit progress for Node memory translations 2026-09-13 12:22:41 +03:00
Lauri Ojansivu ef1d595d3f Repair four Volapük Node memory statistic labels
Preserve total size, size limit, external memory and actual usage distinctions. Dictionary-based technical phrasing remains low confidence.
2026-09-13 12:22:40 +03:00
Lauri Ojansivu 4a50fcb0a0 Record database and upload translation repair progress 2026-09-13 12:22:04 +03:00
Lauri Ojansivu bec13dc5a3 Repair Volapük database migrations and upload labels
Replace French database label and an unflagged Esperanto upload action. Existing migration borrowing remains low confidence.
2026-09-13 12:22:03 +03:00
Lauri Ojansivu 0bde0bb5b2 Update translation audit progress for spinner repairs 2026-09-13 12:21:20 +03:00
Lauri Ojansivu 0db24a3eaf Repair Volapük wait-spinner labels
Replace four French labels while retaining selectable animation identifiers. Dictionary-based software wording remains low confidence and needs native-speaker review.
2026-09-13 12:21:14 +03:00
Lauri Ojansivu e1ca080c06 Record comment-role translation repair progress 2026-09-13 12:18:11 +03:00
Lauri Ojansivu 18ecbef828 Repair Volapük comment-role and URL scheme labels
Preserve comment-only versus assigned-card scope, optional authentication token and one automatically clickable URL scheme per line. Assembled wording remains low confidence pending native review.
2026-09-13 12:18:07 +03:00
Lauri Ojansivu b326ad49d0 Record calendar-label translation repair progress 2026-09-13 12:17:00 +03:00
Lauri Ojansivu b1c2a92ae1 Repair initial Volapük calendar labels
Preserve calendar identities, Dangi proper name and Gregorian calendar with ISO 8601 weeks. Assembled labels remain low confidence pending native review.
2026-09-13 12:16:52 +03:00
Lauri Ojansivu f2435588c5 Record path and warning translation repair progress 2026-09-13 12:15:48 +03:00
Lauri Ojansivu 6356c67b36 Repair Volapük path preview and limit warnings
Preserve full parent hierarchy positions, PDF download alternative, permanent vote deletion and user-defined WIP limit comparison. Assembled wording remains low confidence pending native review.
2026-09-13 12:15:39 +03:00
Lauri Ojansivu 1410349fa8 Record legal-notice translation repair progress 2026-09-13 12:14:39 +03:00
Lauri Ojansivu 5e9f4148c7 Repair Volapük joined legal-notice acceptance text
Preserve continuing and accepting our notice in the combined span/link sentence and custom page URL meaning. Assembled wording remains low confidence pending native review.
2026-09-13 12:14:32 +03:00
Lauri Ojansivu fef9bae41a Record accessibility translation repair progress 2026-09-13 12:13:42 +03:00
Lauri Ojansivu c6a343b518 Repair Volapük accessibility page labels
Use consistent attested accessibility vocabulary and preserve heading title content enablement and missing-information distinctions. Software adaptation remains low confidence pending native review.
2026-09-13 12:13:38 +03:00
Lauri Ojansivu 051e5aabd9 Record authentication translation repair progress 2026-09-13 12:12:52 +03:00
Lauri Ojansivu b3f8c895a1 Repair Volapük authentication-method labels
Use consistent identity-checking terminology and preserve generic display and default-selector functions. Assembled software wording remains low confidence pending native review.
2026-09-13 12:12:48 +03:00
Lauri Ojansivu febbd6472f Record action and reminder translation repair progress 2026-09-13 12:12:05 +03:00
Lauri Ojansivu a612b220da Repair Volapük action reminder and sum labels
Preserve label/member action distinctions, first due-reminder placeholders, wish-list example and numeric sum at list top. Assembled wording remains low confidence pending native review.
2026-09-13 12:11:59 +03:00
Lauri Ojansivu 1707a99e58 Record clipboard translation repair progress 2026-09-13 12:11:05 +03:00
Lauri Ojansivu 88ef9a9e5d Repair Volapük clipboard and autocomplete labels
Use consistent descriptive clipboard wording and preserve card-link/link/text distinctions, drag/drop and emoji/member completion. Assembled software terms remain low confidence pending native review.
2026-09-13 12:11:00 +03:00
Lauri Ojansivu 58b991b14f Record search error translation repair progress 2026-09-13 12:10:16 +03:00
Lauri Ojansivu 9e476cb99b Repair Volapük search operator error messages
Preserve exact operator/value placeholders, expected-number and received-value roles, and existence-check versus debug-predicate errors. Technical wording remains low confidence pending native review.
2026-09-13 12:10:11 +03:00
Lauri Ojansivu 2512b12b18 Record retained migration-label translation progress 2026-09-13 12:09:19 +03:00
Lauri Ojansivu 7ee8552e2c Repair Volapük retained migration-step labels
Preserve analysis validation conversion update finalization and separate recovery targets. Obsolete migration workflows remain removed; assembled wording remains low confidence pending native review.
2026-09-13 12:09:14 +03:00
Lauri Ojansivu 59793642f1 Record support and tracking translation repair progress 2026-09-13 12:08:22 +03:00
Lauri Ojansivu 61da5551c5 Repair Volapük support tracking and card-control messages
Preserve permanent deletion, private-only visibility, label add/remove behavior, creator/member tracking, unsaved description and week-start semantics. Assembled wording remains low confidence pending native review.
2026-09-13 12:08:18 +03:00
Lauri Ojansivu e36360520b Record logo and zoom translation repair progress 2026-09-13 12:07:32 +03:00
Lauri Ojansivu f1202a96d6 Repair Volapük logo OIDC and zoom settings
Preserve top-left position, distinct image/link URLs, default height 27, OIDC identity and zoom range 50-300%. Assembled wording remains low confidence pending native review.
2026-09-13 12:07:26 +03:00
Lauri Ojansivu d462722ac4 Record custom page translation repair progress 2026-09-13 12:06:39 +03:00
Lauri Ojansivu cbde57c3a8 Repair Volapük custom page and manifest settings
Preserve technical filenames, HTML element names, JSON/HTML types and URL labels. Assembled wording and technical adaptations remain low confidence pending native review.
2026-09-13 12:06:33 +03:00
Lauri Ojansivu 14be1f9cac Record description recovery translation repair progress 2026-09-13 12:05:48 +03:00
Lauri Ojansivu 7fff9b4459 Repair Volapük description recovery and input help
Preserve description replacement choice, unsaved-before-close scope, label numbers, upload/rename cancellation, Enter and exact template placeholder. Assembled wording remains low confidence pending native review.
2026-09-13 12:05:43 +03:00
Lauri Ojansivu 440ef09931 Record SMTP translation repair progress 2026-09-13 12:04:56 +03:00
Lauri Ojansivu 3be81305ac Repair Volapük SMTP and troubleshooting messages
Preserve SMTP/TLS identifiers, outgoing-port semantics, exact snap and Docker diagnostic commands and source line breaks. Assembled wording remains low confidence pending native review.
2026-09-13 12:04:52 +03:00
Lauri Ojansivu fc5c4c6a67 Record legacy recovery translation repair progress 2026-09-13 12:04:02 +03:00
Lauri Ojansivu f5a7da3849 Repair Volapük legacy recovery-migration translations
Preserve technical IDs and recovery-column name, non-archived scope, automatic repair and difficult-to-undo warning. Removed migrations remain removed. Assembled wording remains low confidence pending native review.
2026-09-13 12:03:58 +03:00
Lauri Ojansivu 0ee6f73ed8 Record role and setting translation repair progress 2026-09-13 12:02:57 +03:00
Lauri Ojansivu dd192c23cd Repair Volapük role descriptions and list-setting labels
Preserve read-only and assigned-card limits, normal role identity, invitation sender/recipient placeholder, assigned-card filtering, height and maximum-task settings. Assembled wording remains low confidence pending native review.
2026-09-13 12:02:53 +03:00
Lauri Ojansivu 002dee3070 Record duplicate-list translation repair progress 2026-09-13 12:02:10 +03:00
Lauri Ojansivu ddda83b5d2 Repair Volapük duplicate-list deletion warnings
Preserve empty-list and same-title populated-duplicate conditions, conversion before deletion, and distinct sidebar confirmation. Assembled wording remains low confidence pending native review.
2026-09-13 12:02:06 +03:00
Lauri Ojansivu 65c430e851 Update concise audit for selection and keyboard repairs 2026-09-13 12:01:17 +03:00
Lauri Ojansivu 7168d9f1f1 Repair Volapük selection and keyboard-control messages
Preserve paired keyboard actions, all-read/all-unread notification states, checkbox board selection and label/member bulk controls. Descriptive software wording remains low confidence pending native review.
2026-09-13 12:01:12 +03:00
Lauri Ojansivu 7b1fd3de78 Record account and invitation translation repair progress 2026-09-13 12:00:26 +03:00
Lauri Ojansivu 5e591c43a7 Repair Volapük account invitation and display messages
Preserve invitation success and failure, permission and existing-account conditions, possible private-page access after login, and sign-in HTML/URL placeholder. Assembled wording remains low confidence pending native review.
2026-09-13 12:00:20 +03:00
Lauri Ojansivu 837b0f44d0 Update concise audit progress for date and email repairs 2026-09-13 11:59:26 +03:00
Lauri Ojansivu 2cf52d6f29 Repair Volapük date-popup titles and email messages
Preserve start, receipt, due, end and voting-end distinctions, Planning Poker name, invitation sender/recipient roles and successful email semantics. Assembled wording remains low confidence pending native review.
2026-09-13 11:59:20 +03:00
Lauri Ojansivu 962a5daa10 Record latest translation repairs in concise audit summary 2026-09-13 11:58:32 +03:00
Lauri Ojansivu c370b985ef Repair Volapük automatic-width and reconnect messages
Preserve opposite width-control states and actions, the avatar size upper bound, and reconnect semantics. Assembled wording remains low confidence pending native review.
2026-09-13 11:58:29 +03:00
Lauri Ojansivu 183fa9ab85 Update concise translation audit progress summary 2026-09-13 11:57:40 +03:00
Lauri Ojansivu 62cd464dcd Repair Volapük copy-card format and creation sorting
Preserve literal JSON property names, three example cards, and opposite creation-date sort directions. Assembled software wording remains low confidence pending native review.
2026-09-13 11:57:28 +03:00
Lauri Ojansivu fab52e82aa Record scheduled job translation repair progress 2026-09-13 11:54:35 +03:00
Lauri Ojansivu a797a67231 Repair Volapük scheduled job and migration status messages
Preserve start and resume distinctions, retry initiation, failed and paused eligibility and clearing all errors. Assembled software wording remains low confidence pending native review.
2026-09-13 11:54:31 +03:00
Lauri Ojansivu 59ea4b8781 Record administration label translation repair progress 2026-09-13 11:53:33 +03:00
Lauri Ojansivu 44f3d30f5f Repair Volapük card and workspace administration labels
Preserve card hierarchy, custom fields, member assignment and numeric minicard sorting. Software adaptations remain low confidence pending native review.
2026-09-13 11:53:28 +03:00
Lauri Ojansivu 828d3fc3b6 Record date activity translation repair progress 2026-09-13 11:52:35 +03:00
Lauri Ojansivu 7581e0a69d Repair Volapük date activities and account notices
Preserve old and new time roles and received-date versus card-link arguments. Derived receipt and assembled software wording remain low confidence pending native review.
2026-09-13 11:52:30 +03:00
Lauri Ojansivu 06be8cb92a Record member mapping translation repair progress 2026-09-13 11:51:42 +03:00
Lauri Ojansivu 6047a6f848 Repair Volapük member mapping and assignment guidance
Preserve imported-member roles without permission escalation, domain membership and numbered assignee toggles. Technical borrowings and assembled software wording remain low confidence pending native review.
2026-09-13 11:51:36 +03:00
Lauri Ojansivu 1b84ea2081 Record file migration translation repair progress 2026-09-13 11:50:46 +03:00
Lauri Ojansivu cfff5956f7 Repair Volapük file and avatar migration descriptions
Preserve attachment versus member-avatar scope, storage backend, broken references and continuation questions. Technical borrowings and assembled software wording remain low confidence pending native review.
2026-09-13 11:50:42 +03:00
Lauri Ojansivu 3a5e8f8f8c Record loading warning translation repair progress 2026-09-13 11:49:35 +03:00
Lauri Ojansivu c923f1652d Repair Volapük loading warning and scheduled job label
Preserve refresh data-loss warning, server check, scheduled action and planning poker deletion question. Reload derivation and assembled software wording remain low confidence pending native review.
2026-09-13 11:49:31 +03:00
Lauri Ojansivu ed9fd887e3 Record migration confirmation translation repair progress 2026-09-13 11:48:49 +03:00
Lauri Ojansivu c9f8355ba5 Repair Volapük migration confirmations and stages
Preserve integrity repair and missing-list scopes, duration caution and continuation questions. Migration borrowing and assembled software wording remain low confidence pending native review.
2026-09-13 11:48:45 +03:00
Lauri Ojansivu 77b6e867db Record visibility translation repair progress 2026-09-13 11:48:04 +03:00
Lauri Ojansivu 437791daec Repair Volapük visibility search and support descriptions
Preserve viewing and editing permissions, public search discovery, search fields, username length and login requirement. Assembled software wording remains low confidence pending native review.
2026-09-13 11:47:59 +03:00
Lauri Ojansivu 32cc1b3318 Record invitation and WIP translation repair progress 2026-09-13 11:46:57 +03:00
Lauri Ojansivu 582aaa8824 Repair Volapük invitations favorites and WIP guidance
Preserve source invitation tokens and newlines, member-search scope, favorite position and alternative WIP remedies. Assembled software wording remains low confidence pending native review.
2026-09-13 11:46:53 +03:00
Lauri Ojansivu f4b5bd6459 Record notification translation repair progress 2026-09-13 11:45:49 +03:00
Lauri Ojansivu d2c304e7b4 Repair Volapük watch and notification settings
Use established software watch terminology and preserve board/list/card scope, participation updates and default-off disable behavior. Assembled phrases remain low confidence pending native review.
2026-09-13 11:45:44 +03:00
Lauri Ojansivu fff4e332db Record board navigation translation repair progress 2026-09-13 11:44:44 +03:00
Lauri Ojansivu 2a58d65e8d Repair Volapük board navigation and favorite controls
Preserve drag sorting, click-to-open and opposite star actions. Software adaptation and assembled wording remain low confidence pending native review.
2026-09-13 11:44:37 +03:00
Lauri Ojansivu e102b8d20d Record card access translation repair progress 2026-09-13 11:43:41 +03:00
Lauri Ojansivu a35d26ba00 Repair Volapük assigned-card and worker access descriptions
Preserve assigned-only visibility, comment permissions, worker self-assignment and the last-administrator requirement. Role borrowing and assembled software wording remain low confidence pending native review.
2026-09-13 11:43:35 +03:00
Lauri Ojansivu 098b0e2eb1 Record account activation translation repair progress 2026-09-13 11:42:39 +03:00
Lauri Ojansivu 48c03ed5d7 Repair Volapük account activation tooltips
Preserve opposite login activation actions from loginDisabled state. Assembled software phrases remain low confidence pending native review.
2026-09-13 11:42:35 +03:00
Lauri Ojansivu a5d9f8c31d Record board migration translation repair progress 2026-09-13 11:41:47 +03:00
Lauri Ojansivu 2b361a90b4 Repair Volapük board migration descriptions
Preserve administrator restriction, individual execution, missing or damaged lists and list/card/swimlane repair scope. Migration borrowing and assembled software phrases remain low confidence pending native review.
2026-09-13 11:41:44 +03:00
Lauri Ojansivu 844dcaa5a9 Update card and membership translation repair progress 2026-09-13 11:40:42 +03:00
Lauri Ojansivu 6c3cb26ef5 Repair Volapük invitation and role descriptions
Preserve notification scope, checklist line mapping and card editing without settings permissions. Assembled software wording remains low confidence pending native review.
2026-09-13 11:40:35 +03:00
Lauri Ojansivu 68667acf82 Repair Volapük card and checklist action labels
Preserve card and subtask conversion distinction and add-action objects. Reuse local checklist terminology; derived software wording remains low confidence pending native review.
2026-09-13 11:39:57 +03:00
Lauri Ojansivu dd1abd41a8 Record custom translation control repair progress 2026-09-13 11:39:18 +03:00
Lauri Ojansivu 720cd85dd2 Repair Volapük custom translation management controls
Replace French controls and Esperanto terminology, preserving custom-string scope, count and deletion question. Assembled software phrases remain low confidence pending native review.
2026-09-13 11:39:14 +03:00
Lauri Ojansivu 6b0a6bb1e5 Update dated translation repair progress 2026-09-13 11:38:39 +03:00
Lauri Ojansivu d0d49e3ad9 Repair Volapük linked-card and translation deletion wording
Preserve linked-card deletion order and the appended linkedId warning fragment. Replace foreign labels and malformed subtask wording. Derived software terms and assembled phrases remain low confidence pending native review.
2026-09-13 11:38:34 +03:00
Lauri Ojansivu 2535f92f06 Shorten translation audit progress summary 2026-09-13 11:37:43 +03:00
Lauri Ojansivu 31a6873e47 Record translation audit progress after membership instruction repairs 2026-09-13 11:34:57 +03:00
Lauri Ojansivu 9babfce9b4 Repair Volapük board membership and invitation instructions 2026-09-13 11:34:57 +03:00
Lauri Ojansivu 12a6919eb4 Record translation audit progress after time tracking repairs 2026-09-13 11:33:47 +03:00
Lauri Ojansivu 263c227370 Repair Volapük time tracking labels and board summaries 2026-09-13 11:33:46 +03:00
Lauri Ojansivu b96ed5dd8b Record translation audit progress after due date repairs 2026-09-13 11:32:44 +03:00
Lauri Ojansivu 07658b2e65 Repair Volapük due date search and reminder messages 2026-09-13 11:32:43 +03:00
Lauri Ojansivu 01054d9e8a Record translation audit progress after assignment repairs 2026-09-13 11:31:36 +03:00
Lauri Ojansivu d291c9cb62 Repair Volapük assignee labels and assignment search help 2026-09-13 11:31:35 +03:00
Lauri Ojansivu 5385209b68 Record translation audit progress after search explanation repairs 2026-09-13 11:30:46 +03:00
Lauri Ojansivu 4574aa632e Repair Volapük search syntax and combination explanations 2026-09-13 11:30:45 +03:00
Lauri Ojansivu cc1baa5651 Record translation audit progress after search operator repairs 2026-09-13 11:29:02 +03:00
Lauri Ojansivu 55b125b403 Repair Volapük search operator help and examples 2026-09-13 11:29:01 +03:00
Lauri Ojansivu d4db0a067a Record translation audit progress after path and separator repairs 2026-09-13 11:27:58 +03:00
Lauri Ojansivu d99c198f5b Repair Volapük import path and separator messages 2026-09-13 11:27:58 +03:00
Lauri Ojansivu 7406bb0f69 Record translation audit progress after import format repairs 2026-09-13 11:26:59 +03:00
Lauri Ojansivu 362182f5a6 Repair Volapük ZIP and CSV import descriptions 2026-09-13 11:26:58 +03:00
Lauri Ojansivu 21497469b9 Record translation audit progress after export instruction repairs 2026-09-13 11:25:40 +03:00
Lauri Ojansivu caec821998 Repair Volapük board export and import navigation 2026-09-13 11:25:39 +03:00
Lauri Ojansivu 26813b83ac Record translation audit progress after import mapping repairs 2026-09-13 11:24:34 +03:00
Lauri Ojansivu 3f06b5f96f Repair Volapük import member mapping instructions 2026-09-13 11:24:33 +03:00
Lauri Ojansivu b13c3b74cf Record translation audit progress after swimlane control repairs 2026-09-13 11:23:33 +03:00
Lauri Ojansivu b73722e80d Repair Volapük swimlane controls and warnings 2026-09-13 11:23:32 +03:00
Lauri Ojansivu 78d3afdbe2 Record translation audit progress after card activity repairs 2026-09-13 11:22:39 +03:00
Lauri Ojansivu 15d98e2bed Repair Volapük comment and card activity translations 2026-09-13 11:22:38 +03:00
Lauri Ojansivu 9c704cf9c5 Record translation audit progress after swimlane repairs 2026-09-13 11:21:34 +03:00
Lauri Ojansivu 75ccb4973d Repair Volapük swimlane terminology and activity messages 2026-09-13 11:21:29 +03:00
Lauri Ojansivu f2aa96252c Record translation audit progress after account protection repairs 2026-09-13 11:19:38 +03:00
Lauri Ojansivu ad8f23e9dd Repair Volapük account protection descriptions and failure window 2026-09-13 11:19:38 +03:00
Lauri Ojansivu bfc91dd590 Update translation audit progress after board description repairs 2026-09-13 11:18:39 +03:00
Lauri Ojansivu bbec32d474 Repair Volapük board permissions and custom HTML descriptions 2026-09-13 11:18:35 +03:00
Lauri Ojansivu 78b9cc50df Record translation audit progress after migration label repairs 2026-09-13 11:17:33 +03:00
Lauri Ojansivu 6960d838bc Repair Volapük migration progress labels and instructions 2026-09-13 11:17:28 +03:00
Lauri Ojansivu 257a11265c Update translation audit progress after migration status repairs 2026-09-13 11:16:33 +03:00
Lauri Ojansivu 9ada654b6e Repair French migration status messages in Volapük 2026-09-13 11:16:27 +03:00
Lauri Ojansivu 6757591a24 Shorten translation audit progress summary 2026-09-13 11:15:46 +03:00
Lauri Ojansivu 97c5baebb3 Update translation audit after login setting repairs 2026-09-13 11:12:43 +03:00
Lauri Ojansivu e3b8a6ad92 Repair Volapük custom login logo and shortcut settings 2026-09-13 11:12:33 +03:00
Lauri Ojansivu 426aa588b7 Update translation audit after subtask repairs 2026-09-13 11:11:52 +03:00
Lauri Ojansivu 01eed29328 Repair Volapük subtask interface translations 2026-09-13 11:11:41 +03:00
Lauri Ojansivu 50620e5563 Update translation audit after visibility setting repairs 2026-09-13 11:11:06 +03:00
Lauri Ojansivu dd979bad0d Repair Volapük card visibility settings 2026-09-13 11:10:56 +03:00
Lauri Ojansivu 1dab98b804 Update translation audit after rule trigger repairs 2026-09-13 11:10:24 +03:00
Lauri Ojansivu 6b1eb02ebe Repair Volapük rule trigger fragments and matching note 2026-09-13 11:10:10 +03:00
Lauri Ojansivu 6986197205 Update translation audit after shortcut label repairs 2026-09-13 11:09:17 +03:00
Lauri Ojansivu 873d107268 Repair Volapük keyboard shortcut and dialog labels 2026-09-13 11:09:06 +03:00
Lauri Ojansivu 81239a0c0b Update translation audit after import prompt repairs 2026-09-13 11:08:35 +03:00
Lauri Ojansivu 85a282681e Repair Volapük import prompts and export date label 2026-09-13 11:08:25 +03:00
Lauri Ojansivu 15d25223f8 Update translation audit after export and import repairs 2026-09-13 11:07:39 +03:00
Lauri Ojansivu 30ffe4beae Repair Volapük export and import labels 2026-09-13 11:07:28 +03:00
Lauri Ojansivu 459a53cb45 Update translation audit after invitation status repairs 2026-09-13 11:06:52 +03:00
Lauri Ojansivu 8084254dc7 Repair Volapük invitation status and account permission messages 2026-09-13 11:06:42 +03:00
Lauri Ojansivu 292e83ab84 Update translation audit after date activity repairs 2026-09-13 11:05:54 +03:00
Lauri Ojansivu 97f0ce2fc7 Repair Volapük date change activity messages 2026-09-13 11:05:44 +03:00
Lauri Ojansivu 43752e9a5a Update translation audit after due date filter repairs 2026-09-13 11:05:10 +03:00
Lauri Ojansivu 6a57bac4d0 Repair Volapük due date filters and remaining time labels 2026-09-13 11:05:01 +03:00
Lauri Ojansivu d102ea8b3c Update translation audit after migration label repairs 2026-09-13 11:04:29 +03:00
Lauri Ojansivu 0c955d8147 Repair Volapük migration action labels 2026-09-13 11:04:19 +03:00
Lauri Ojansivu ace9b10215 Update translation audit after workspace label repairs 2026-09-13 11:03:47 +03:00
Lauri Ojansivu b466daf430 Repair Volapük subworkspace and icon labels 2026-09-13 11:03:38 +03:00
Lauri Ojansivu 9d30485e09 Update translation audit after upload limit repairs 2026-09-13 11:02:58 +03:00
Lauri Ojansivu d2f1b9508f Repair Volapük upload limits and test email labels 2026-09-13 11:02:48 +03:00
Lauri Ojansivu deb0d0d0bc Update translation audit after positioning label repairs 2026-09-13 11:02:18 +03:00
Lauri Ojansivu 15ae8dfd9b Repair Volapük positioning and member labels 2026-09-13 11:02:08 +03:00
Lauri Ojansivu bd8f5f8497 Update translation audit after menu label repairs 2026-09-13 11:01:29 +03:00
Lauri Ojansivu 9c34b50dfa Repair Volapük menu and account labels 2026-09-13 11:01:20 +03:00
Lauri Ojansivu 802cfc55b6 Update translation audit after filter interface repairs 2026-09-13 11:00:45 +03:00
Lauri Ojansivu 267cf60c5c Repair Volapük filter interface labels 2026-09-13 11:00:34 +03:00
Lauri Ojansivu 712cfb8a2e Update translation audit after history-loss warning repairs 2026-09-13 11:00:06 +03:00
Lauri Ojansivu 307e1c8d05 Repair Volapük history and permanent deletion warnings 2026-09-13 10:59:57 +03:00
Lauri Ojansivu 798d923ed4 Update translation audit after restoration and membership repairs 2026-09-13 10:58:56 +03:00
Lauri Ojansivu 0112eb12a7 Repair Volapük archive restoration and membership messages 2026-09-13 10:58:46 +03:00
Lauri Ojansivu d3b0724c95 Update translation audit after archive warning repairs 2026-09-13 10:58:07 +03:00
Lauri Ojansivu ed8f25c7e4 Repair Volapük deletion and archive warnings 2026-09-13 10:57:58 +03:00
Lauri Ojansivu b4c73df015 Update translation audit after comment and attachment repairs 2026-09-13 10:57:13 +03:00
Lauri Ojansivu 77430c3367 Repair Volapük attachment and comment messages 2026-09-13 10:57:04 +03:00
Lauri Ojansivu e37c5d8190 Update translation audit after board activity repairs 2026-09-13 10:56:28 +03:00
Lauri Ojansivu b7e4c491ba Repair Volapük board activity translations 2026-09-13 10:56:19 +03:00
Lauri Ojansivu f8cd104113 Update translation audit after temporary lockout repairs 2026-09-13 10:55:40 +03:00
Lauri Ojansivu fa798e56db Repair Volapük login and temporary lockout messages 2026-09-13 10:55:31 +03:00
Lauri Ojansivu 0f57d684bc Update translation audit after login protection repairs 2026-09-13 10:54:54 +03:00
Lauri Ojansivu 98d69b5ad5 Repair Volapük login protection labels 2026-09-13 10:54:45 +03:00
Lauri Ojansivu 6d448bd3dc Update translation audit after account label repairs 2026-09-13 10:53:57 +03:00
Lauri Ojansivu 2b043dbb1c Repair Volapük account unlock and deletion labels 2026-09-13 10:53:48 +03:00
Lauri Ojansivu c2eb496095 Update translation audit after search warning repairs 2026-09-13 10:53:14 +03:00
Lauri Ojansivu 0a825156ec Repair Volapük search validation warnings 2026-09-13 10:53:06 +03:00
Lauri Ojansivu a82b25e09c Shorten translation audit progress summary 2026-09-13 10:52:36 +03:00
Lauri Ojansivu 79c8d73b91 Refresh audit summary after search-help repairs 2026-09-13 10:49:51 +03:00
Lauri Ojansivu 1e2fedf851 Repair Volapük search operator help
Preserve operator tokens and example identifiers while replacing French explanations for board, list, creator, member and comment searches. Assembled relative clauses remain low confidence.
2026-09-13 10:49:50 +03:00
Lauri Ojansivu 6e0595fbd5 Refresh short audit summary after search descriptions 2026-09-13 10:48:56 +03:00
Lauri Ojansivu e506e71341 Repair Volapük search and predicate descriptions
Preserve predicate code tokens and private, public and archive scope. Dictionary-based software senses and assembled grammar remain low confidence.
2026-09-13 10:48:55 +03:00
Lauri Ojansivu 3517f2974f Refresh audit summary after checklist form repairs 2026-09-13 10:47:48 +03:00
Lauri Ojansivu c1849955b1 Repair Volapük checklist form instructions
Preserve add/edit and checklist/item distinctions, original-order option and comma-separated input instructions. Dictionary-based software senses and assembled grammar remain low confidence.
2026-09-13 10:47:47 +03:00
Lauri Ojansivu c16b4ef943 Refresh audit summary after list-control repairs 2026-09-13 10:46:40 +03:00
Lauri Ojansivu 02378e77c0 Repair Volapük list controls and rename activity
Remove stray digit before the list-name placeholder and preserve archive, filter and card/minicard display meanings. Dictionary-based software senses and assembled grammar remain low confidence.
2026-09-13 10:46:40 +03:00
Lauri Ojansivu 47a16f1892 Refresh short audit summary after invitation repairs 2026-09-13 10:45:46 +03:00
Lauri Ojansivu 4cad8f842d Repair Volapük invitation messages
Preserve inviter, recipient, board and URL tokens and paragraph formatting. Keep invitation and collaboration meanings. Assembled prose and board-membership grammar remain low confidence.
2026-09-13 10:45:45 +03:00
Lauri Ojansivu 79ff74830c Refresh audit summary after email body repairs 2026-09-13 10:44:41 +03:00
Lauri Ojansivu 5f15aeb464 Repair Volapük account and password email bodies
Preserve recipient and URL placeholders and paragraph formatting in enrollment, password-reset and email-verification instructions. Assembled prose remains low confidence.
2026-09-13 10:44:40 +03:00
Lauri Ojansivu 47932f61db Refresh audit progress after email status repairs 2026-09-13 10:43:31 +03:00
Lauri Ojansivu 8065fe4a90 Repair Volapük email status and account subjects
Use primary Volapük email and sign-in terminology. Preserve site placeholders and reset, verification, failure and account-creation meanings. Assembled grammar remains low confidence.
2026-09-13 10:43:30 +03:00
Lauri Ojansivu e0cfecb423 Refresh short audit summary after sign-in wording repairs 2026-09-13 10:42:44 +03:00
Lauri Ojansivu 65fe8db602 Repair Volapük credentials and email address wording
Use primary Volapük sign-in terminology for passwords, username validation and mismatch warnings. Preserve required and already-used meanings. Assembled phrases remain low confidence.
2026-09-13 10:42:32 +03:00
Lauri Ojansivu 9f4d617842 Refresh audit progress after member-control repairs 2026-09-13 10:41:03 +03:00
Lauri Ojansivu bfb8941d7b Repair Volapük member controls and username wording
Replace French and Esperanto titles and warnings. Preserve lookup placeholders, no-undo warning and organization board-removal meaning. Software adaptations and assembled grammar remain low confidence.
2026-09-13 10:41:02 +03:00
Lauri Ojansivu 4cdf90a78e Refresh translation audit summary after organization repairs 2026-09-13 10:40:13 +03:00
Lauri Ojansivu 2a34de3a70 Repair Volapük organization labels and warnings
Replace French organization text, preserving lookup placeholders, count separator and irreversible deletion wording. Dictionary-based organization software sense and assembled grammar remain low confidence.
2026-09-13 10:40:12 +03:00
Lauri Ojansivu 2364498b62 Refresh short audit summary after image label repairs 2026-09-13 10:39:18 +03:00
Lauri Ojansivu f3b8377d2e Repair Volapük background and cover image labels
Preserve board background, minicard cover and selection-colour meanings. Dictionary-based software senses and assembled grammar remain low confidence.
2026-09-13 10:39:17 +03:00
Lauri Ojansivu d1a6426721 Refresh audit summary after attachment storage repairs 2026-09-13 10:38:24 +03:00
Lauri Ojansivu 383db41dac Repair Volapük attachment storage action labels
Preserve singular, all-board and global attachment scope and filesystem, GridFS and S3 destinations. Dictionary-based filesystem phrase and assembled grammar remain low confidence.
2026-09-13 10:38:23 +03:00
Lauri Ojansivu 2da7423a67 Refresh audit summary after board label repairs 2026-09-13 10:37:34 +03:00
Lauri Ojansivu 4af40676c7 Repair Volapük board settings and count labels
Preserve all-board settings, all-member scope and per-list card counts. Keep the people-count separator. Dictionary-based software senses and assembled grammar remain low confidence.
2026-09-13 10:37:33 +03:00
Lauri Ojansivu f5f4d7a4e7 Refresh short audit summary after template repairs 2026-09-13 10:36:36 +03:00
Lauri Ojansivu 7885238681 Repair Volapük template containers and copy labels
Use checked template and container vocabulary consistently across card, list and board labels. Preserve many-card copy scope. Software adaptations and assembled phrases remain low confidence.
2026-09-13 10:36:35 +03:00
Lauri Ojansivu 3fdf16da2e Update translation audit summary after checklist repairs 2026-09-13 10:35:48 +03:00
Lauri Ojansivu 3b76f621a3 Repair Volapük checklist controls and template labels
Replace French labels using dictionary vocabulary, including the computer-specific template term. Preserve completed and marked-item filtering distinctions. Derived compounds and assembled grammar remain low confidence.
2026-09-13 10:35:47 +03:00
Lauri Ojansivu 6ec17dd0af Refresh translation audit progress after warning repairs 2026-09-13 10:34:42 +03:00
Lauri Ojansivu a8546de953 Repair Volapük deletion and removal warnings
Preserve team membership blocker, irreversible deletion warnings and the distinction between deleting a team and removing its board assignment. Dictionary-based assembled phrases and software vocabulary remain low confidence.
2026-09-13 10:34:41 +03:00
Lauri Ojansivu 8de5922714 Update short translation audit summary after team repairs 2026-09-13 10:33:30 +03:00
Lauri Ojansivu 84f521f327 Repair Volapük team labels and warnings
Replace French and Esperanto team text using dictionary vocabulary. Preserve lookup placeholders and the team-count separator. Assembled grammar and software senses remain low confidence.
2026-09-13 10:33:20 +03:00
Lauri Ojansivu a98de5e6ae Update translation audit progress for display repairs 2026-09-13 10:30:13 +03:00
Lauri Ojansivu 369dab63c8 Repair Volapük card and minicard display labels
Replace six French labels; preserve display destinations and all versus new card scope. Software senses and full phrases remain low confidence pending native review.
2026-09-13 10:29:56 +03:00
Lauri Ojansivu b11b5bdd7f Update translation audit progress for account lock repairs 2026-09-13 10:29:20 +03:00
Lauri Ojansivu e402be0f5a Repair Volapük account lock status translations
Replace four French labels; retain unlocking action and locked-users-only scope. Account terminology and assembled grammar remain low confidence pending native review.
2026-09-13 10:29:04 +03:00
Lauri Ojansivu eac2a8eee8 Update translation audit progress for notification repairs 2026-09-13 10:28:29 +03:00
Lauri Ojansivu 641a3d7ece Repair Volapük notification and card action labels
Replace six French labels using dictionary vocabulary and consistent local terminology. Preserve action scopes; derived compounds and full grammar remain low confidence pending native review.
2026-09-13 10:28:14 +03:00
Lauri Ojansivu f1106717bf Update translation audit progress for archive repairs 2026-09-13 10:27:24 +03:00
Lauri Ojansivu c15c3dbe85 Repair Volapük archive and restoration action labels
Replace five French values and express restoration as undoing archiving. Preserve action direction and placeholders; full grammar remains low confidence pending native review.
2026-09-13 10:27:10 +03:00
Lauri Ojansivu 3f915e4b67 Update translation audit progress for card action repairs 2026-09-13 10:26:34 +03:00
Lauri Ojansivu e3425046c4 Repair Volapük card positioning rule actions
Replace five French values; retain own-list distinction, top/bottom positions and all-member removal scope. Complete UI phrases remain low confidence pending native review.
2026-09-13 10:26:22 +03:00
Lauri Ojansivu d145cefa79 Update translation audit progress for rule action repairs 2026-09-13 10:25:15 +03:00
Lauri Ojansivu 2edb89c82a Repair Volapük rule title and item marking action labels
Replace three French values; retain all-items scope and unchecking reversal. Assembled software terminology and grammar remain low confidence pending native review.
2026-09-13 10:25:02 +03:00
Lauri Ojansivu 83358c432d Update translation audit progress for custom field repairs 2026-09-13 10:24:20 +03:00
Lauri Ojansivu 8f0591d974 Repair Volapük custom field labels and activities
Replace five French values while preserving user-defined field distinction and source placeholders. Software terminology and assembled grammar remain low confidence pending native review.
2026-09-13 10:24:04 +03:00
Lauri Ojansivu 42b647a513 Update translation audit progress for attachment repairs 2026-09-13 10:23:04 +03:00
Lauri Ojansivu 07cd633dcd Repair Volapük attachment labels and label color error
Replace five French values using dictionary vocabulary; preserve error meaning and placeholders. Derived attachment noun and full grammar remain low confidence pending native review.
2026-09-13 10:22:49 +03:00
Lauri Ojansivu 8cc4db273d Record terminology review of Volapük settings repairs 2026-09-13 10:22:16 +03:00
Lauri Ojansivu 43c13e40ac Refine Volapük settings translations from computer terminology
Use dictionary-attested computer settings term väls in three previously repaired labels. Preserve original provenance records; complete phrases and workspace compound still need native review.
2026-09-13 10:22:02 +03:00
Lauri Ojansivu 1cafa51b3c Update translation audit progress for label repairs 2026-09-13 10:21:24 +03:00
Lauri Ojansivu 847e92f8bd Repair Volapük label activity translations
Replace five foreign-language values using attested label vocabulary. Preserve quoted names and placeholder order; assembled UI grammar remains low confidence pending native review.
2026-09-13 10:21:12 +03:00
Lauri Ojansivu 01bae35d39 Update translation audit progress for item marking repairs 2026-09-13 10:20:16 +03:00
Lauri Ojansivu e75890a85f Repair Volapük checklist item marking activities
Replace four French messages and preserve checking reversal and placeholder order. Derived nouns and complete grammar remain low confidence pending native review.
2026-09-13 10:20:04 +03:00
Lauri Ojansivu b52bdbd07a Update translation audit progress for completion repairs 2026-09-13 10:19:20 +03:00
Lauri Ojansivu 09c4b6fadb Repair Volapük checklist completion activity messages
Replace three French messages; preserve completion reversal and placeholder order. Assembled grammar remains low confidence pending native review.
2026-09-13 10:19:04 +03:00
Lauri Ojansivu 055ed12cd4 Update translation audit progress for checklist repairs 2026-09-13 10:18:30 +03:00
Lauri Ojansivu d27c628848 Repair Volapük checklist addition and removal messages
Replace six checklist labels and activities; preserve item distinction and placeholder order. Checklist compound and complete grammar remain low confidence pending native review.
2026-09-13 10:18:16 +03:00
Lauri Ojansivu af23e5acef Update translation audit progress for movement repairs 2026-09-13 10:17:42 +03:00
Lauri Ojansivu 1dbaf4ffe6 Repair Volapük movement and membership activity labels
Replace five French messages while preserving placeholder order. Assembled membership constructions and complete UI grammar remain low confidence pending native review.
2026-09-13 10:17:31 +03:00
Lauri Ojansivu 1716eb5007 Update translation audit progress for activity repairs 2026-09-13 10:17:01 +03:00
Lauri Ojansivu 05e6767b8e Repair Volapük import and comment activity messages
Replace six French messages and preserve placeholder order. Assembled grammar and data-import terminology remain low confidence pending native review.
2026-09-13 10:16:40 +03:00
Lauri Ojansivu 21844edf58 Update translation audit progress for settings repairs 2026-09-13 10:16:07 +03:00
Lauri Ojansivu a5a2148691 Repair Volapük workspace and user settings labels
Replace four French labels and align workspace wording with repaired actions. Software-settings terminology and assembled phrases remain low confidence pending native review.
2026-09-13 10:15:45 +03:00
Lauri Ojansivu 241a4caf82 Update translation audit progress for URL label repairs 2026-09-13 10:15:07 +03:00
Lauri Ojansivu bab97498d6 Repair Volapük URL correction labels
Replace three French labels using dictionary vocabulary while retaining technical identifiers. Assembled phrases remain low confidence pending native review.
2026-09-13 10:14:55 +03:00
Lauri Ojansivu ffe3f97fd3 Update translation audit progress for duplicate list repairs 2026-09-13 10:14:18 +03:00
Lauri Ojansivu a1efb39a12 Repair Volapük duplicate list deletion labels
Replace four French labels and retain empty-list qualifiers. Software duplicate terminology and assembled phrases remain low confidence pending speaker review.
2026-09-13 10:14:06 +03:00
Lauri Ojansivu 041a141f84 Update translation audit progress for username repairs 2026-09-13 10:13:30 +03:00
Lauri Ojansivu 9db61a2a75 Repair Volapük removal and username labels
Replace five French labels using dictionary vocabulary. Data import sense, compounds and assembled UI phrases remain low confidence pending native review.
2026-09-13 10:13:03 +03:00
Lauri Ojansivu d27daafc33 Update translation audit progress for workspace repairs 2026-09-13 10:12:19 +03:00
Lauri Ojansivu efabf483ad Repair Volapük workspace and system report labels
Replace seven French labels using dictionary vocabulary. Workspace compound and complete software phrases remain low confidence pending native review.
2026-09-13 10:12:11 +03:00
Lauri Ojansivu 1289198bbb Update translation audit progress for Volapük repairs 2026-09-13 10:11:21 +03:00
Lauri Ojansivu 2a54a4a70f Repair Volapük field and member selection labels
Replace four French labels using dictionary vocabulary. Assembled UI phrases and software-field terminology remain low confidence pending speaker review.
2026-09-13 10:11:10 +03:00
Lauri Ojansivu f037ac356e Refresh translation audit after Northern Sami Hebrew repair 2026-09-13 10:07:40 +03:00
Lauri Ojansivu a88086f073 Repair Northern Sami Hebrew calendar label
Adapt documented Hebrew terminology. Stem adaptation and assembled label remain low confidence.
2026-09-13 10:07:35 +03:00
Lauri Ojansivu 9ce7d36d89 Refresh translation audit after Northern Sami Coptic repair 2026-09-13 10:06:55 +03:00
Lauri Ojansivu b135afe465 Repair Northern Sami Coptic calendar label
Use indexed national library adjective terminology. Full page returned 403; assembled wording remains low confidence.
2026-09-13 10:06:51 +03:00
Lauri Ojansivu 610b79c360 Refresh translation audit after Northern Sami repair 2026-09-13 10:06:07 +03:00
Lauri Ojansivu 4c24a8fa83 Repair Northern Sami Indian national calendar label
Use documented national and calendar terminology. Assembled wording remains low confidence.
2026-09-13 10:06:02 +03:00
Lauri Ojansivu 7c35c15736 Refresh translation audit after Dzongkha national calendar repair 2026-09-13 10:05:08 +03:00
Lauri Ojansivu 3e6c178040 Repair Dzongkha Indian national calendar label
Use official national terminology. Assembled phrase remains low confidence.
2026-09-13 10:04:59 +03:00
Lauri Ojansivu ba85983f8c Record Tigre calendar vocabulary review evidence 2026-09-13 10:03:44 +03:00
Lauri Ojansivu e9876efd76 Refresh translation audit after Dzongkha Jalali repair 2026-09-13 10:03:09 +03:00
Lauri Ojansivu 3685fe80df Repair Dzongkha Jalali calendar designation
Use CLDR calendar and Persian terminology while preserving Jalali. Adapted wording remains low confidence.
2026-09-13 10:03:03 +03:00
Lauri Ojansivu 781cdce232 Refresh translation audit after Cherokee completion repair 2026-09-13 10:01:59 +03:00
Lauri Ojansivu d12d7e7ceb Correct Cherokee Pomodoro completion terminology
Replace amateur wording with indexed completed terminology and preserve the count token. Rendering and counted grammar remain low confidence.
2026-09-13 10:01:54 +03:00
Lauri Ojansivu 2b685a5555 Refresh translation audit after Cherokee start repair 2026-09-13 10:01:13 +03:00
Lauri Ojansivu 2995108cef Repair Cherokee Pomodoro start terminology
Use attested Start terminology in syllabary. Rendering and button wording remain low confidence.
2026-09-13 10:01:08 +03:00
Lauri Ojansivu 1ea1da7342 Refresh translation audit after Cherokee rest repair 2026-09-13 10:00:35 +03:00
Lauri Ojansivu 1f3b57187f Repair Cherokee Pomodoro rest terminology
Use attested rest wording in syllabary. Rendering and UI noun usage remain low confidence.
2026-09-13 10:00:30 +03:00
Lauri Ojansivu f09b0f530a Refresh translation audit after Cherokee Pomodoro repair 2026-09-13 09:59:43 +03:00
Lauri Ojansivu 848fc7cfac Correct Cherokee Pomodoro work terminology
Replace respect/loyalty wording with attested work terminology in syllabary. UI noun usage remains low confidence.
2026-09-13 09:59:39 +03:00
Lauri Ojansivu 0d717918d2 Refresh translation audit after Cherokee repair 2026-09-13 09:58:35 +03:00
Lauri Ojansivu 3756665b6d Repair Cherokee Indian national calendar label
Use CLDR calendar name and terminology. Adapted full label remains low confidence.
2026-09-13 09:58:31 +03:00
Lauri Ojansivu 654b3ef0fc Refresh translation audit after Dzongkha Hebrew repair 2026-09-13 09:57:59 +03:00
Lauri Ojansivu d740a13db7 Repair Dzongkha Hebrew calendar label
Use CLDR Hebrew and calendar terminology. Assembled wording remains low confidence.
2026-09-13 09:57:55 +03:00
Lauri Ojansivu ae720c3882 Refresh translation audit after Dzongkha Hijri repairs 2026-09-13 09:57:25 +03:00
Lauri Ojansivu 1499f42502 Repair Dzongkha Hijri calendar labels
Use the Dzongkha calendar term with proper Hijri and Umm al-Qura identifiers. Assembled wording remains low confidence.
2026-09-13 09:57:20 +03:00
Lauri Ojansivu 03c2278a00 Refresh translation audit after Dzongkha Buddhist repair 2026-09-13 09:56:46 +03:00
Lauri Ojansivu 254e094992 Repair Dzongkha Buddhist calendar label
Use official dictionary Buddhist terminology and the CLDR calendar term. Assembled wording remains low confidence.
2026-09-13 09:56:42 +03:00
Lauri Ojansivu 4466726a6c Refresh translation audit after Dzongkha country calendar repairs 2026-09-13 09:56:07 +03:00
Lauri Ojansivu c270bdb2c7 Repair Dzongkha country calendar labels
Use CLDR country names and calendar terminology, preserving Amete Alem. Assembled grammar remains low confidence.
2026-09-13 09:56:03 +03:00
Lauri Ojansivu 8f7e2637bd Refresh translation audit after Dzongkha repairs 2026-09-13 09:55:29 +03:00
Lauri Ojansivu d934cac4ad Repair Dzongkha Dangi and Minguo calendar labels
Use CLDR calendar terminology and preserve proper names. Assembled labels remain low confidence.
2026-09-13 09:55:25 +03:00
Lauri Ojansivu 9c282679d0 Refresh translation audit after Quechua repair 2026-09-13 09:54:50 +03:00
Lauri Ojansivu 9050ceb0b7 Repair Quechua Indian national calendar label
Use Quechua national and calendar terminology. Assembled wording remains low confidence.
2026-09-13 09:54:46 +03:00
Lauri Ojansivu 586a102320 Refresh translation audit after Sakha Ethiopic repairs 2026-09-13 09:54:05 +03:00
Lauri Ojansivu c5d15f039b Repair Sakha Ethiopic calendar labels
Use indexed native country terminology and preserve Amete Alem. Full article retrieval timed out; assembled wording remains low confidence.
2026-09-13 09:53:59 +03:00
Lauri Ojansivu 3c749e2c7b Refresh translation audit after Sakha national calendar repair 2026-09-13 09:53:14 +03:00
Lauri Ojansivu bb551189bf Repair Sakha Indian national calendar label
Use indexed native country and national terminology. Full newspaper fetch timed out; assembled wording remains low confidence.
2026-09-13 09:53:10 +03:00
Lauri Ojansivu c7dfd8aff4 Refresh translation audit after Sakha named calendar repairs 2026-09-13 09:52:26 +03:00
Lauri Ojansivu 4d215c4795 Repair Sakha Dangi and Minguo calendar labels
Preserve proper calendar identifiers and translate calendar wording. Assembled labels remain low confidence pending native review.
2026-09-13 09:52:22 +03:00
Lauri Ojansivu 0773085fd1 Refresh translation audit after Sakha repairs 2026-09-13 09:51:44 +03:00
Lauri Ojansivu b1257ef4d5 Repair Sakha Islamic calendar labels
Use the CLDR calendar term and preserve the Umm al-Qura identifier. The source term is provisional; native-speaker verification remains pending.
2026-09-13 09:51:39 +03:00
Lauri Ojansivu 93aeca0d19 Update translation audit after Cornish calendar repair 2026-09-13 09:50:59 +03:00
Lauri Ojansivu 3d2d411b86 Repair Cornish Gregorian calendar label
Use dictionary calendar terminology and the CLDR Gregorian adjective. Adapted wording and unconfirmed CLDR evidence remain low confidence.
2026-09-13 09:50:56 +03:00
Lauri Ojansivu fc29e59cad Refresh translation audit progress after Fulah repair 2026-09-13 09:50:09 +03:00
Lauri Ojansivu 880eab1c67 Repair Fulah Indian national calendar translation
Use dictionary-supported national terminology and the Fulah country name. Assembled calendar grammar remains low confidence.
2026-09-13 09:50:05 +03:00
Lauri Ojansivu 339f8feaf7 Shorten translation audit progress summary 2026-09-13 09:49:26 +03:00
Lauri Ojansivu 7fc8c8b332 Refresh concise audit after Fulah Hebrew calendar repair 2026-09-13 09:45:47 +03:00
Lauri Ojansivu 05666a6413 Repair Fulah Hebrew calendar label 2026-09-13 09:45:42 +03:00
Lauri Ojansivu 307eda37d0 Refresh concise audit after Fulah calendar setting repair 2026-09-13 09:45:07 +03:00
Lauri Ojansivu c649eff63d Repair foreign seeded Fulah calendar setting label 2026-09-13 09:45:02 +03:00
Lauri Ojansivu e4a9e59f60 Refresh concise audit after Fulah country calendar repairs 2026-09-13 09:43:36 +03:00
Lauri Ojansivu 1bc69f3193 Repair Fulah Chinese Japanese and Ethiopian calendar labels 2026-09-13 09:43:30 +03:00
Lauri Ojansivu d0029f01b5 Refresh concise audit after Fulah calendar repairs 2026-09-13 09:42:50 +03:00
Lauri Ojansivu 3323ef4303 Repair Fulah named calendar labels 2026-09-13 09:42:45 +03:00
Lauri Ojansivu ecd1d9bd74 Update concise audit after Kashubian Gregorian repair 2026-09-13 09:41:54 +03:00
Lauri Ojansivu bd7dcb724f Repair Kashubian Gregorian calendar label 2026-09-13 09:41:49 +03:00
Lauri Ojansivu 893ef82d0b Refresh concise audit after Kashubian Indian calendar repair 2026-09-13 09:40:59 +03:00
Lauri Ojansivu a8d5093978 Repair Kashubian Indian national calendar label 2026-09-13 09:40:54 +03:00
Lauri Ojansivu 15d1d16587 Refresh concise audit after Kashubian calendar setting repair 2026-09-13 09:40:13 +03:00
Lauri Ojansivu 3970158943 Repair foreign seeded Kashubian calendar setting label 2026-09-13 09:40:09 +03:00
Lauri Ojansivu 66d9df82f5 Refresh concise audit after Kashubian Persian repair 2026-09-13 09:39:26 +03:00
Lauri Ojansivu 6ce1c7ffb0 Repair Kashubian Persian calendar descriptor 2026-09-13 09:39:18 +03:00
Lauri Ojansivu d2f3607a6a Refresh concise audit after Kashubian week and Japanese repairs 2026-09-13 09:38:40 +03:00
Lauri Ojansivu 464cae1763 Repair Kashubian week and Japanese calendar labels 2026-09-13 09:38:35 +03:00
Lauri Ojansivu fc09eb5736 Update concise audit after Kashubian calendar repairs 2026-09-13 09:37:44 +03:00
Lauri Ojansivu 0e23830e42 Repair Kashubian calendar noun and calendar names 2026-09-13 09:37:40 +03:00
Lauri Ojansivu 650b15714e Refresh concise audit after Greenlandic Hebrew label repair 2026-09-13 09:36:54 +03:00
Lauri Ojansivu 881f4b98bd Repair Greenlandic Hebrew calendar label from published usage 2026-09-13 09:36:50 +03:00
Lauri Ojansivu f1a6884f73 Update concise audit after Greenlandic country calendar repairs 2026-09-13 09:36:10 +03:00
Lauri Ojansivu a65efabc05 Repair Greenlandic Chinese Japanese and Ethiopian calendar labels 2026-09-13 09:36:06 +03:00
Lauri Ojansivu fc35c75083 Refresh concise audit after Greenlandic calendar repairs 2026-09-13 09:35:31 +03:00
Lauri Ojansivu 39a1a97978 Repair Greenlandic named calendar labels 2026-09-13 09:35:26 +03:00
Lauri Ojansivu 832e39c3d3 Refresh concise audit after Cornish sighting repair 2026-09-13 09:34:41 +03:00
Lauri Ojansivu 6714285488 Restore lunar sighting distinction in Cornish Hijri label 2026-09-13 09:34:37 +03:00
Lauri Ojansivu 4c58d6a0ec Update audit progress after Cornish Hebrew and Persian repairs 2026-09-13 09:33:20 +03:00
Lauri Ojansivu 8c2d1efe60 Repair Cornish Hebrew and Persian calendar labels 2026-09-13 09:33:13 +03:00
Lauri Ojansivu 3e1af25f74 Refresh translation progress after Cornish country labels 2026-09-13 09:32:37 +03:00
Lauri Ojansivu b642a5f53b Repair Cornish Ethiopian and Indian calendar labels 2026-09-13 09:32:33 +03:00
Lauri Ojansivu 9169b6db7c Update concise audit after Cornish calendar repairs 2026-09-13 09:31:46 +03:00
Lauri Ojansivu 6ef6e535e6 Repair Cornish calendar settings and calendar labels 2026-09-13 09:31:42 +03:00
Lauri Ojansivu 6fafc4333a Refresh concise translation repair progress summary 2026-09-13 09:30:45 +03:00
Lauri Ojansivu bbdba94b11 Repair Cornish Chinese and Japanese calendar labels 2026-09-13 09:30:41 +03:00
Lauri Ojansivu 3fa0b7273d Refresh concise translation audit after Buryat country and Buddhist repairs 2026-09-13 09:27:39 +03:00
Lauri Ojansivu 56dc809bc1 Repair Buryat Ethiopian Indian national and Buddhist calendar labels 2026-09-13 09:27:25 +03:00
Lauri Ojansivu 0970d8df08 Refresh short translation audit after Buryat country and ISO labels 2026-09-13 09:26:42 +03:00
Lauri Ojansivu 43a19564b2 Repair Buryat Chinese Japanese and ISO calendar labels 2026-09-13 09:26:28 +03:00
Lauri Ojansivu fa59ca5944 Refresh concise translation audit after Buryat calendar repairs 2026-09-13 09:25:53 +03:00
Lauri Ojansivu 9d8830fa3d Repair Buryat calendar noun and named calendar labels 2026-09-13 09:25:39 +03:00
Lauri Ojansivu fc48fc1164 Refresh concise audit progress after Tibetan Buddhist label 2026-09-13 09:25:00 +03:00
Lauri Ojansivu d59b956564 Repair Tibetan Buddhist calendar label 2026-09-13 09:24:46 +03:00
Lauri Ojansivu bab13b30e3 Update concise audit summary after Tibetan country calendar repairs 2026-09-13 09:24:08 +03:00
Lauri Ojansivu c5a871bae2 Repair Tibetan Ethiopian and Indian national calendar labels 2026-09-13 09:23:52 +03:00
Lauri Ojansivu 8140216192 Refresh short translation audit after Tibetan calendar repairs 2026-09-13 09:23:19 +03:00
Lauri Ojansivu 4af6611be4 Repair Tibetan calendar setting names and ISO week detail 2026-09-13 09:23:04 +03:00
Lauri Ojansivu 670eb814a4 Refresh short audit summary after Bambara national and sighting repairs 2026-09-13 09:22:22 +03:00
Lauri Ojansivu 675aa98bfc Repair Bambara national calendar and Hijri moon sighting descriptions 2026-09-13 09:22:09 +03:00
Lauri Ojansivu 72c15f9201 Refresh short translation audit after Bambara calendar repairs 2026-09-13 09:21:32 +03:00
Lauri Ojansivu 9a016c73d5 Repair Bambara calendar setting country names and ISO week detail 2026-09-13 09:21:19 +03:00
Lauri Ojansivu 46643879b8 Update short translation audit after Rundi national and sighting labels 2026-09-13 09:20:46 +03:00
Lauri Ojansivu 6489dd9953 Repair Rundi national calendar and Hijri moon sighting labels 2026-09-13 09:20:32 +03:00
Lauri Ojansivu 507b2ba2f4 Refresh concise translation audit after Rundi country calendar labels 2026-09-13 09:20:02 +03:00
Lauri Ojansivu 04b21cafce Repair Rundi Persian Chinese Japanese and Ethiopian calendar labels 2026-09-13 09:19:47 +03:00
Lauri Ojansivu bbaeaf1bd6 Refresh concise translation audit after Rundi calendar repairs 2026-09-13 09:19:15 +03:00
Lauri Ojansivu 85e9cd8d71 Repair Rundi calendar setting names and Gregorian ISO week detail 2026-09-13 09:19:01 +03:00
Lauri Ojansivu 88d0cb3838 Update short audit summary after Ndebele calendar description repairs 2026-09-13 09:18:26 +03:00
Lauri Ojansivu 011af79140 Repair Ndebele national sighting and ISO calendar descriptions 2026-09-13 09:18:11 +03:00
Lauri Ojansivu fc136e0a28 Refresh short translation audit after Ndebele country calendar repairs 2026-09-13 09:17:31 +03:00
Lauri Ojansivu 9656ef22f3 Repair Northern Ndebele Persian and country calendar labels 2026-09-13 09:17:18 +03:00
Lauri Ojansivu 2d8a2fcbf2 Update short translation audit after Ndebele repairs and Swati refinement 2026-09-13 09:16:47 +03:00
Lauri Ojansivu 5a58c1c057 Repair Northern Ndebele calendar labels and refine Swati Hebrew wording 2026-09-13 09:16:33 +03:00
Lauri Ojansivu 37452648ad Refresh short audit summary after Swati national and sighting labels 2026-09-13 09:15:57 +03:00
Lauri Ojansivu fef8381e14 Repair Swati national calendar and Hijri moon sighting labels 2026-09-13 09:15:45 +03:00
Lauri Ojansivu e21ecece49 Refresh short translation audit after Swati Hebrew and Jalali labels 2026-09-13 09:15:17 +03:00
Lauri Ojansivu 8967a51b0e Repair Swati Hebrew and Jalali calendar labels 2026-09-13 09:15:04 +03:00
Lauri Ojansivu fe3c689a8e Refresh short audit summary after Swati country calendar repairs 2026-09-13 09:14:34 +03:00
Lauri Ojansivu 8bbec63e4a Repair Swati country calendar labels and ISO week detail 2026-09-13 09:14:21 +03:00
Lauri Ojansivu d7e9d4ac57 Refresh concise audit summary after Swati calendar repairs 2026-09-13 09:13:45 +03:00
Lauri Ojansivu bb528d5528 Repair Swati calendar setting and calendar identity labels 2026-09-13 09:13:32 +03:00
Lauri Ojansivu a679c6fbec Update short translation audit after Northern Sotho country labels 2026-09-13 09:13:00 +03:00
Lauri Ojansivu 25c237712b Repair Northern Sotho Ethiopian and Indian national calendar labels 2026-09-13 09:12:46 +03:00
Lauri Ojansivu ddf01e7b68 Refresh concise translation audit after Northern Sotho religious labels 2026-09-13 09:12:10 +03:00
Lauri Ojansivu 493f6b3894 Repair Northern Sotho religious calendar and moon sighting labels 2026-09-13 09:11:57 +03:00
Lauri Ojansivu 83294e999b Update concise translation audit after Northern Sotho repairs 2026-09-13 09:11:22 +03:00
Lauri Ojansivu fb6600c8b0 Repair Northern Sotho calendar setting labels and ISO weeks 2026-09-13 09:11:09 +03:00
Lauri Ojansivu f42ca9d699 Update short audit summary after Tsonga date format and sighting repairs 2026-09-13 09:10:40 +03:00
Lauri Ojansivu 54bd08ec22 Restore Tsonga date format choices and Hijri sighting detail 2026-09-13 09:10:28 +03:00
Lauri Ojansivu 41deaf1999 Refresh translation audit summary after Tsonga religion and country repairs 2026-09-13 09:09:54 +03:00
Lauri Ojansivu aa6f5024ac Repair Tsonga Buddhist Persian Ethiopian and Indian calendar labels 2026-09-13 09:09:39 +03:00
Lauri Ojansivu 04b29b4b58 Refresh concise audit progress after Tsonga calendar repairs 2026-09-13 09:09:00 +03:00
Lauri Ojansivu 61e0cdef1a Repair Tsonga calendar setting names and ISO week label 2026-09-13 09:08:46 +03:00
Lauri Ojansivu e20475e0fe Update short translation audit summary after Setswana repairs 2026-09-13 09:08:12 +03:00
Lauri Ojansivu d0044f13a1 Repair Setswana national and moon sighting calendar labels 2026-09-13 09:08:01 +03:00
Lauri Ojansivu b5ef18fc3d Refresh concise translation audit progress summary 2026-09-13 09:07:19 +03:00
Lauri Ojansivu 426050ee94 Repair Setswana Hebrew Buddhist and Persian calendar labels 2026-09-13 09:07:04 +03:00
Lauri Ojansivu 94a555dc81 Record Setswana calendar translation repair progress 2026-09-13 09:04:32 +03:00
Lauri Ojansivu 4e315ae01c Repair Setswana calendar setting and date labels 2026-09-13 09:04:26 +03:00
Lauri Ojansivu fccbaa1166 Record Sesotho calendar variant repair progress 2026-09-13 09:03:41 +03:00
Lauri Ojansivu 5c5989e636 Repair Sesotho Ethiopic national and Hijri sighting labels 2026-09-13 09:03:35 +03:00
Lauri Ojansivu 0741fe3908 Record Sesotho religious calendar repair progress 2026-09-13 09:02:50 +03:00
Lauri Ojansivu 47f5a2661e Repair Sesotho Buddhist Hebrew and Persian calendar labels 2026-09-13 09:02:46 +03:00
Lauri Ojansivu fd65725019 Record Sesotho calendar translation repair progress 2026-09-13 09:01:55 +03:00
Lauri Ojansivu 29f0f4b4a5 Repair Sesotho calendar setting and date labels 2026-09-13 09:01:48 +03:00
Lauri Ojansivu 0b9b754f88 Record Luganda remaining calendar repair progress 2026-09-13 09:01:08 +03:00
Lauri Ojansivu 61c81fe7d9 Repair Luganda Buddhist national and Hijri sighting labels 2026-09-13 09:01:01 +03:00
Lauri Ojansivu acb7a13753 Record Luganda calendar terminology repair progress 2026-09-13 09:00:24 +03:00
Lauri Ojansivu 64e7588480 Repair Luganda Persian Hebrew and ISO week labels 2026-09-13 09:00:20 +03:00
Lauri Ojansivu a29376d4be Record Luganda calendar translation repair progress 2026-09-13 08:59:44 +03:00
Lauri Ojansivu 22422bfeb1 Repair Luganda calendar setting and date labels 2026-09-13 08:59:38 +03:00
Lauri Ojansivu 4adc37e757 Record Northern Sami country calendar repair progress 2026-09-13 08:58:43 +03:00
Lauri Ojansivu 14630fe453 Repair Northern Sami Persian Japanese and Ethiopic calendar labels 2026-09-13 08:58:34 +03:00
Lauri Ojansivu 133f34d72d Record Northern Sami calendar repair progress 2026-09-13 08:58:00 +03:00
Lauri Ojansivu 5d732d0da4 Repair Northern Sami Dangi Hijri and Minguo calendar labels 2026-09-13 08:57:55 +03:00
Lauri Ojansivu 8d6e1d9239 Record Manx Hijri sighting repair progress 2026-09-13 08:57:15 +03:00
Lauri Ojansivu 36fce19cc5 Restore Manx Saudi Hijri moon sighting detail 2026-09-13 08:57:10 +03:00
Lauri Ojansivu 358dc85ef7 Record Manx national calendar repair progress 2026-09-13 08:56:25 +03:00
Lauri Ojansivu fd850277e6 Repair Manx Indian national and Gregorian ISO week labels 2026-09-13 08:56:20 +03:00
Lauri Ojansivu 861ce31413 Record Manx religious calendar repair progress 2026-09-13 08:55:29 +03:00
Lauri Ojansivu a74d9b7e6a Repair Manx Buddhist Ethiopic and Hebrew calendar labels 2026-09-13 08:55:24 +03:00
Lauri Ojansivu 1092a2a305 Record Manx calendar setting repair progress 2026-09-13 08:54:45 +03:00
Lauri Ojansivu 6bbdb85f48 Repair Manx calendar setting and country labels 2026-09-13 08:54:40 +03:00
Lauri Ojansivu 7c293b3fd0 Record Manx calendar translation repair progress 2026-09-13 08:53:29 +03:00
Lauri Ojansivu 22adf938ae Repair Manx Dangi Hijri and Minguo calendar labels 2026-09-13 08:53:25 +03:00
Lauri Ojansivu b0870dd343 Record Tongan calendar translation repair progress 2026-09-13 08:52:35 +03:00
Lauri Ojansivu 878b793571 Repair Tongan Hijri sighting and ISO week labels 2026-09-13 08:52:31 +03:00
Lauri Ojansivu 8691d9439b Record Ewe calendar translation repair progress 2026-09-13 08:51:34 +03:00
Lauri Ojansivu 80084c9bc8 Repair Ewe Dangi and Hijri calendar labels 2026-09-13 08:51:30 +03:00
Lauri Ojansivu 5f82e5c78b Record Fijian calendar variant repair progress 2026-09-13 08:50:49 +03:00
Lauri Ojansivu ee319ddc53 Repair Fijian Ethiopic Dangi and Hijri sighting labels 2026-09-13 08:50:45 +03:00
Lauri Ojansivu b950d8ac94 Record Fijian calendar translation repair progress 2026-09-13 08:49:56 +03:00
Lauri Ojansivu daa2a5d079 Repair Fijian calendar setting and date labels 2026-09-13 08:49:52 +03:00
Lauri Ojansivu ffd12ec89f Record Hawaiian Buddhist calendar repair progress 2026-09-13 08:48:54 +03:00
Lauri Ojansivu c35eaa8a2a Repair Hawaiian Buddhist and Gregorian calendar labels 2026-09-13 08:48:45 +03:00
Lauri Ojansivu 35a3a8a2be Record Hawaiian calendar terminology repair progress 2026-09-13 08:48:13 +03:00
Lauri Ojansivu 0622242b90 Repair Hawaiian Persian Ethiopic Hebrew and Indian calendar labels 2026-09-13 08:48:09 +03:00
Lauri Ojansivu f3926ba38e Record Hawaiian calendar translation repair progress 2026-09-13 08:47:01 +03:00
Lauri Ojansivu 391fc01723 Repair Hawaiian calendar setting and date labels 2026-09-13 08:46:57 +03:00
Lauri Ojansivu 1c6c76f814 Record Chichewa calendar translation repair progress 2026-09-13 08:46:04 +03:00
Lauri Ojansivu 8256b8539f Restore Gregorian ISO week details in Chichewa 2026-09-13 08:46:01 +03:00
Lauri Ojansivu 8c04dfc87a Record Shona calendar translation repair progress 2026-09-13 08:45:22 +03:00
Lauri Ojansivu 95e89a33cf Repair Shona civil Hijri and ISO week labels 2026-09-13 08:43:16 +03:00
Lauri Ojansivu aa96b05036 Record Samoan calendar translation repair progress 2026-09-13 08:42:38 +03:00
Lauri Ojansivu 0492cedff4 Repair Samoan civil Hijri and ISO week labels 2026-09-13 08:42:31 +03:00
Lauri Ojansivu bcef02f90a Record Aymara calendar translation repair progress 2026-09-13 08:41:43 +03:00
Lauri Ojansivu 299871c81a Repair Aymara calendar setting and ISO week label 2026-09-13 08:41:38 +03:00
Lauri Ojansivu 237531eaf9 Record Akan calendar translation repair progress 2026-09-13 08:41:01 +03:00
Lauri Ojansivu be88e25b65 Repair Akan calendar identities and variant qualifiers 2026-09-13 08:40:55 +03:00
Lauri Ojansivu a00fcd3934 Record Guarani calendar translation repair progress 2026-09-13 08:40:17 +03:00
Lauri Ojansivu b4d97631ed Repair Guarani Hijri variant and ISO week labels 2026-09-13 08:40:10 +03:00
Lauri Ojansivu ee87077cd9 Record Xhosa calendar translation repair progress 2026-09-13 08:39:27 +03:00
Lauri Ojansivu 4204d47dbd Repair Xhosa Hijri variants and ISO week label 2026-09-13 08:39:18 +03:00
Lauri Ojansivu a74b050f01 Record Yoruba calendar translation repair progress 2026-09-13 08:38:37 +03:00
Lauri Ojansivu 1cc25000a7 Repair Yoruba calendar labels and missing variant meanings 2026-09-13 08:38:31 +03:00
Lauri Ojansivu 28aee9c93c Record Waray flagged repair progress and remaining review 2026-09-13 08:37:46 +03:00
Lauri Ojansivu d156034df8 Repair remaining flagged Waray calendars and JSON example 2026-09-13 08:37:41 +03:00
Lauri Ojansivu 8ba7875d3f Record Waray imported member translation progress 2026-09-13 08:36:58 +03:00
Lauri Ojansivu 62f8861513 Repair Waray imported member mapping guidance 2026-09-13 08:36:53 +03:00
Lauri Ojansivu 6555989e7f Record Waray loading translation repair progress 2026-09-13 08:36:14 +03:00
Lauri Ojansivu 54684c398f Repair Waray loading and storage labels 2026-09-13 08:36:08 +03:00
Lauri Ojansivu f6b47ba769 Record Waray calendar translation repair progress 2026-09-13 08:35:31 +03:00
Lauri Ojansivu 0628c381ef Repair Waray calendar labels using declared locale 2026-09-13 08:35:24 +03:00
Lauri Ojansivu 4fbef027ac Record Acehnese terminology review progress 2026-09-13 08:34:32 +03:00
Lauri Ojansivu 60090ccb2a Revise Acehnese reactivity mode wording 2026-09-13 08:34:25 +03:00
Lauri Ojansivu 3588c811fe Record Wolof flagged calendar repair progress and follow-up 2026-09-13 08:33:30 +03:00
Lauri Ojansivu ce1d167f36 Repair remaining flagged Wolof calendar labels 2026-09-13 08:33:18 +03:00
Lauri Ojansivu b56b8b5064 Record Wolof Hijri translation repair progress 2026-09-13 08:32:37 +03:00
Lauri Ojansivu ced1e25bda Repair Wolof Hijri calendar variant labels 2026-09-13 08:32:30 +03:00
Lauri Ojansivu 0515f54360 Update audit summary for Wolof country calendar repairs 2026-09-13 08:31:56 +03:00
Lauri Ojansivu a8c08ae0de Repair Wolof country calendar and Hijri labels 2026-09-13 08:31:50 +03:00
Lauri Ojansivu adc2b59561 Record Wolof checklist fragment translation progress 2026-09-13 08:31:12 +03:00
Lauri Ojansivu f22738bf7a Repair Wolof checklist trigger fragments 2026-09-13 08:31:06 +03:00
Lauri Ojansivu 52443f9747 Record Wolof advanced filter translation progress 2026-09-13 08:30:20 +03:00
Lauri Ojansivu 083b618035 Repair Wolof advanced filter instructions 2026-09-13 08:30:14 +03:00
Lauri Ojansivu a351e9b939 Record Wolof accessibility translation repair progress 2026-09-13 08:29:38 +03:00
Lauri Ojansivu 641e7605c5 Repair Wolof accessibility and legal notice labels 2026-09-13 08:29:32 +03:00
Lauri Ojansivu 00a932f5d8 Record Wolof repository translation repair progress 2026-09-13 08:28:58 +03:00
Lauri Ojansivu d5762c22b2 Repair Wolof repository labels and upload guidance 2026-09-13 08:28:52 +03:00
Lauri Ojansivu 87ee88a20c Record Wolof team translation repair progress 2026-09-13 08:28:06 +03:00
Lauri Ojansivu 0d2b305652 Repair Wolof team management translations 2026-09-13 08:28:00 +03:00
Lauri Ojansivu 6f5c438f0d Update audit summary for Wolof loading and storage repairs 2026-09-13 08:27:24 +03:00
Lauri Ojansivu 323bf45931 Repair Wolof loading style and storage labels 2026-09-13 08:27:18 +03:00
Lauri Ojansivu ac39f7cd89 Update audit summary for Wolof heap metric repairs 2026-09-13 08:26:41 +03:00
Lauri Ojansivu 73d94b4310 Repair Wolof heap metric terminology 2026-09-13 08:26:35 +03:00
Lauri Ojansivu 818f5e2a80 Record Wolof memory metric translation progress 2026-09-13 08:25:57 +03:00
Lauri Ojansivu 49c88da8af Repair Wolof memory metric labels 2026-09-13 08:25:51 +03:00
Lauri Ojansivu 4f62c8dcf1 Record Wolof imported member translation progress 2026-09-13 08:25:16 +03:00
Lauri Ojansivu 35539dec78 Repair Wolof imported member mapping guidance 2026-09-13 08:25:11 +03:00
Lauri Ojansivu b1f0a957ff Update audit summary for Wolof search syntax repairs 2026-09-13 08:24:37 +03:00
Lauri Ojansivu 5d89aac4b1 Repair Wolof search syntax and planning guidance 2026-09-13 08:24:32 +03:00
Lauri Ojansivu 03f2432266 Record Wolof archive and access translation progress 2026-09-13 08:23:57 +03:00
Lauri Ojansivu ab65f697d6 Repair Wolof archive and access guidance 2026-09-13 08:23:52 +03:00
Lauri Ojansivu c346db3afa Record Wolof calendar label translation progress 2026-09-13 08:23:12 +03:00
Lauri Ojansivu e01b34b282 Repair Wolof calendar selection labels 2026-09-13 08:23:06 +03:00
Lauri Ojansivu cb23080938 Record Wolof enrollment translation repair progress 2026-09-13 08:22:21 +03:00
Lauri Ojansivu 92a903a675 Repair Wolof enrollment and vote date controls 2026-09-13 08:22:17 +03:00
Lauri Ojansivu fba8cd2fbe Record Wolof clipboard translation repair progress 2026-09-13 08:21:43 +03:00
Lauri Ojansivu f25084dad5 Repair Wolof clipboard and image paste guidance 2026-09-13 08:21:38 +03:00
Lauri Ojansivu ea1c5fc0d9 Record Wolof keyboard translation repair progress 2026-09-13 08:21:08 +03:00
Lauri Ojansivu 9bf7b657eb Repair Wolof keyboard and checklist controls 2026-09-13 08:21:03 +03:00
Lauri Ojansivu a52b32aaf6 Record Wolof notification and warning repair progress 2026-09-13 08:20:29 +03:00
Lauri Ojansivu 4df26af344 Repair Wolof notification and card warning messages 2026-09-13 08:20:24 +03:00
Lauri Ojansivu 75b92334ba Record Wolof visibility and deletion translation progress 2026-09-13 08:19:46 +03:00
Lauri Ojansivu ed52a3e687 Repair Wolof visibility and permanent deletion warnings 2026-09-13 08:19:41 +03:00
Lauri Ojansivu 04d3038be9 Update audit summary for Wolof migration step repairs 2026-09-13 08:19:02 +03:00
Lauri Ojansivu 3e15852af8 Repair Wolof migration steps and server troubleshooting 2026-09-13 08:18:57 +03:00
Lauri Ojansivu 3fa20c36ad Record Wolof card recovery translation progress 2026-09-13 08:18:09 +03:00
Lauri Ojansivu 24e6508f01 Repair Wolof card recovery and list display guidance 2026-09-13 08:18:05 +03:00
Lauri Ojansivu 5a24c8e9f2 Record Wolof restoration and SMTP translation progress 2026-09-13 08:17:28 +03:00
Lauri Ojansivu 8cb5c55c1f Repair Wolof restoration and SMTP settings 2026-09-13 08:17:23 +03:00
Lauri Ojansivu e5b2deef9a Record Wolof import and display repair progress 2026-09-13 08:16:37 +03:00
Lauri Ojansivu 4a9ae12963 Repair Wolof import and card window settings 2026-09-13 08:16:26 +03:00
Lauri Ojansivu 69c488a5a9 Update audit summary for Wolof status translation repairs 2026-09-13 08:15:51 +03:00
Lauri Ojansivu 7f0807a11e Repair Wolof board and membership status messages 2026-09-13 08:15:46 +03:00
Lauri Ojansivu 95155ca347 Update audit summary for Wolof date search repairs 2026-09-13 08:15:12 +03:00
Lauri Ojansivu 7413939074 Repair Wolof date search and URL repair controls 2026-09-13 08:15:08 +03:00
Lauri Ojansivu e1c4dda85c Record Wolof search translation repair progress 2026-09-13 08:14:28 +03:00
Lauri Ojansivu 8623707f57 Repair Wolof search operators and archive guidance 2026-09-13 08:14:24 +03:00
Lauri Ojansivu c43d3588e3 Update audit summary for Wolof email translation repairs 2026-09-13 08:13:46 +03:00
Lauri Ojansivu 63111a929e Repair Wolof email delivery and account verification messages 2026-09-13 08:13:42 +03:00
Lauri Ojansivu 2161a64f87 Update translation audit after Wolof customization repairs 2026-09-13 08:13:09 +03:00
Lauri Ojansivu 545c8663b4 Repair Wolof customization and logo settings 2026-09-13 08:13:03 +03:00
Lauri Ojansivu 5db7d3b281 Update audit summary for Wolof date and settings repairs 2026-09-13 08:12:05 +03:00
Lauri Ojansivu 5e9f01b0ff Repair Wolof date settings and custom field deletion warning 2026-09-13 08:11:59 +03:00
Lauri Ojansivu e0493409ef Record Wolof width and display translation progress 2026-09-13 08:11:23 +03:00
Lauri Ojansivu d02e9e1f15 Repair Wolof automatic width and account display controls 2026-09-13 08:11:20 +03:00
Lauri Ojansivu 020cc98af1 Record Wolof reminder and membership repair progress 2026-09-13 08:10:44 +03:00
Lauri Ojansivu f0e538eaa5 Repair Wolof reminders and membership messages 2026-09-13 08:10:40 +03:00
Lauri Ojansivu e3b1686cbf Record Wolof deadline and import translation progress 2026-09-13 08:10:08 +03:00
Lauri Ojansivu 3c2a2dc3ed Repair Wolof deadline reminders and board import instructions 2026-09-13 08:10:04 +03:00
Lauri Ojansivu 5ec3877d6d Update audit summary for Wolof account and date repairs 2026-09-13 08:09:32 +03:00
Lauri Ojansivu f0632cd91f Repair Wolof account lockout and date activity messages 2026-09-13 08:09:26 +03:00
Lauri Ojansivu 30d0eef1a3 Update audit summary for Wolof migration retry repairs 2026-09-13 08:08:51 +03:00
Lauri Ojansivu 3c4a7cf6d9 Repair Wolof scheduled migration retry and resume messages 2026-09-13 08:08:46 +03:00
Lauri Ojansivu 5a3f029e8c Update audit summary after Wolof migration control repairs 2026-09-13 08:08:16 +03:00
Lauri Ojansivu cf32293fd0 Repair Wolof migration controls and status labels 2026-09-13 08:08:12 +03:00
Lauri Ojansivu 8dbc26c7b9 Record Wolof restoration warning translation progress 2026-09-13 08:07:41 +03:00
Lauri Ojansivu db5a44fd10 Repair Wolof restoration and duplicate cleanup warnings 2026-09-13 08:07:37 +03:00
Lauri Ojansivu b2a45ac1e1 Record Wolof migration confirmation translation progress 2026-09-13 08:07:04 +03:00
Lauri Ojansivu 72b2e0c002 Repair Wolof migration confirmations and URL repair guidance 2026-09-13 08:07:00 +03:00
Lauri Ojansivu 90c5476e0b Update audit summary for Wolof migration repairs 2026-09-13 08:06:23 +03:00
Lauri Ojansivu 8949339a58 Repair Wolof board migration guidance 2026-09-13 08:06:19 +03:00
Lauri Ojansivu 92198e2a93 Record Wolof navigation and search translation progress 2026-09-13 08:05:47 +03:00
Lauri Ojansivu 98cf839392 Repair Wolof board navigation and search guidance 2026-09-13 08:05:41 +03:00
Lauri Ojansivu a5bd9aa61e Update translation audit after Wolof invitation repairs 2026-09-13 08:05:11 +03:00
Lauri Ojansivu 6d3042194a Repair Wolof invitations and board access descriptions 2026-09-13 08:05:10 +03:00
Lauri Ojansivu e44286022a Record Wolof membership translation repair progress 2026-09-13 08:04:31 +03:00
Lauri Ojansivu 4a44fac96b Repair Wolof membership confirmations and board guidance 2026-09-13 08:04:27 +03:00
Lauri Ojansivu db1a4b4527 Update translation audit summary after Wolof message repairs 2026-09-13 08:03:57 +03:00
Lauri Ojansivu dc527edae5 Repair Wolof loading warning and import recovery guidance 2026-09-13 08:03:54 +03:00
Lauri Ojansivu 73de6b8577 Refresh translation audit after scheduled job repairs 2026-09-13 08:01:31 +03:00
Lauri Ojansivu 286897ff91 Fix Wolof scheduled job and error clearing controls 2026-09-13 08:01:30 +03:00
Lauri Ojansivu 425e316bc8 Refresh translation audit after color scope review 2026-09-13 08:00:51 +03:00
Lauri Ojansivu b7cae334c9 Clarify Wolof selected item color scope and color controls 2026-09-13 08:00:50 +03:00
Lauri Ojansivu fc7481a252 Refresh translation audit after selection control repairs 2026-09-13 07:59:57 +03:00
Lauri Ojansivu 18e508eda6 Fix Wolof selection label member and color controls 2026-09-13 07:59:56 +03:00
Lauri Ojansivu 3d49602002 Refresh translation audit after movement and display repairs 2026-09-13 07:59:20 +03:00
Lauri Ojansivu 6be6a01007 Fix Wolof card movement image removal and sidebar controls 2026-09-13 07:59:19 +03:00
Lauri Ojansivu 150ac39e83 Refresh translation audit after membership message repairs 2026-09-13 07:58:42 +03:00
Lauri Ojansivu f9d93bf8bd Fix Wolof people credential and card membership messages 2026-09-13 07:58:41 +03:00
Lauri Ojansivu 9bb8b00d26 Refresh translation audit after missing record label repairs 2026-09-13 07:57:57 +03:00
Lauri Ojansivu a84bd45d84 Fix Wolof missing identity and parent display labels 2026-09-13 07:57:57 +03:00
Lauri Ojansivu 9aadb14ee7 Refresh translation audit after rule label repairs 2026-09-13 07:57:10 +03:00
Lauri Ojansivu 7206b01aaf Fix Wolof swimlane checklist and update rule labels 2026-09-13 07:57:10 +03:00
Lauri Ojansivu b7021abfa9 Refresh translation audit after template and import label repairs 2026-09-13 07:56:30 +03:00
Lauri Ojansivu bf0ef26113 Fix Wolof template names and list import controls 2026-09-13 07:56:29 +03:00
Lauri Ojansivu d9a9d2768b Refresh translation audit after swimlane sizing repairs 2026-09-13 07:55:51 +03:00
Lauri Ojansivu 36814315e3 Fix Wolof swimlane sizing and search messages 2026-09-13 07:55:50 +03:00
Lauri Ojansivu e21ac66d67 Refresh translation audit after swimlane action repairs 2026-09-13 07:55:14 +03:00
Lauri Ojansivu b97c98375d Fix Wolof list and swimlane action labels 2026-09-13 07:55:13 +03:00
Lauri Ojansivu 99c87a1074 Refresh translation audit after board navigation repairs 2026-09-13 07:54:31 +03:00
Lauri Ojansivu 16b9ace590 Fix Wolof board navigation labels 2026-09-13 07:54:30 +03:00
Lauri Ojansivu 39ef3011d6 Refresh translation audit after general action repairs 2026-09-13 07:53:54 +03:00
Lauri Ojansivu 3947c76706 Fix Wolof general action and settings labels 2026-09-13 07:53:53 +03:00
Lauri Ojansivu bf0b1d7d4a Refresh translation audit after due card repairs 2026-09-13 07:53:13 +03:00
Lauri Ojansivu ceef17470e Fix Wolof due card views and date change labels 2026-09-13 07:53:12 +03:00
Lauri Ojansivu 2694b405bd Refresh translation audit after card action repairs 2026-09-13 07:52:35 +03:00
Lauri Ojansivu 12f7872975 Fix Wolof card action and minicard display labels 2026-09-13 07:52:34 +03:00
Lauri Ojansivu 0d90856dfd Refresh translation audit after custom field heading repairs 2026-09-13 07:51:55 +03:00
Lauri Ojansivu 82f7896112 Fix Wolof custom field headings and popup titles 2026-09-13 07:51:55 +03:00
Lauri Ojansivu 202480e835 Refresh translation audit after import mapping repairs 2026-09-13 07:51:18 +03:00
Lauri Ojansivu e2c4abf4f5 Fix Wolof import member mapping and ZIP structure labels 2026-09-13 07:51:17 +03:00
Lauri Ojansivu faac61b44a Refresh translation audit after custom field type repairs 2026-09-13 07:50:34 +03:00
Lauri Ojansivu 50d5bbb90a Fix Wolof custom field types and template format controls 2026-09-13 07:50:33 +03:00
Lauri Ojansivu c34e3a4d18 Refresh translation audit after validation error repairs 2026-09-13 07:49:50 +03:00
Lauri Ojansivu 377dd6713e Fix Wolof permission account and JSON errors 2026-09-13 07:49:50 +03:00
Lauri Ojansivu 2b48979f38 Refresh translation audit after credential repairs 2026-09-13 07:49:15 +03:00
Lauri Ojansivu 27f40adcae Fix Wolof credential labels and validation messages 2026-09-13 07:49:14 +03:00
Lauri Ojansivu 4c429bb3f4 Refresh translation audit after custom translation repairs 2026-09-13 07:48:32 +03:00
Lauri Ojansivu de0b55e88d Fix Wolof custom translation controls 2026-09-13 07:48:31 +03:00
Lauri Ojansivu 45c08dd3d2 Refresh translation audit after settings title repairs 2026-09-13 07:47:54 +03:00
Lauri Ojansivu d34bb46581 Fix Wolof minicard organization and user settings titles 2026-09-13 07:47:54 +03:00
Lauri Ojansivu 474a3350b2 Refresh translation audit after organization repairs 2026-09-13 07:47:15 +03:00
Lauri Ojansivu 6c84c42ceb Fix Wolof organization controls and deletion restrictions 2026-09-13 07:47:14 +03:00
Lauri Ojansivu 3aa824dbf4 Refresh translation audit after option and template repairs 2026-09-13 07:46:34 +03:00
Lauri Ojansivu 5795cb840c Fix Wolof option prompts template container and deletion warning 2026-09-13 07:46:33 +03:00
Lauri Ojansivu 44ea037c85 Refresh translation audit after linked card warning repairs 2026-09-13 07:45:53 +03:00
Lauri Ojansivu 77b0797cbd Fix Wolof linked card warnings and archive recovery guidance 2026-09-13 07:45:52 +03:00
Lauri Ojansivu 9e4a978203 Refresh translation audit after list repair descriptions 2026-09-13 07:45:11 +03:00
Lauri Ojansivu af5c00cf41 Fix Wolof list repair and duplicate deletion descriptions 2026-09-13 07:45:10 +03:00
Lauri Ojansivu f80965ec7e Refresh translation audit after list action repairs 2026-09-13 07:44:37 +03:00
Lauri Ojansivu 78b4df2fd0 Fix Wolof duplicate list and list action translations 2026-09-13 07:44:36 +03:00
Lauri Ojansivu 9919bf4b6f Refresh translation audit after checklist control repairs 2026-09-13 07:43:59 +03:00
Lauri Ojansivu a12cd204f7 Fix Wolof checklist controls and item count labels 2026-09-13 07:43:58 +03:00
Lauri Ojansivu 79876943d5 Refresh translation audit after role label repairs 2026-09-13 07:43:20 +03:00
Lauri Ojansivu 61fd37e866 Fix Wolof role member and assignee labels 2026-09-13 07:43:19 +03:00
Lauri Ojansivu 7415d8d5a2 Refresh translation audit after notification repairs 2026-09-13 07:42:45 +03:00
Lauri Ojansivu 4c8cc2b3e9 Fix Wolof watching and notification controls 2026-09-13 07:42:44 +03:00
Lauri Ojansivu 0bc85055fc Refresh translation audit after card display repairs 2026-09-13 07:42:07 +03:00
Lauri Ojansivu b464a877f1 Fix Wolof card display and week of year labels 2026-09-13 07:42:06 +03:00
Lauri Ojansivu 3d31f6e95d Refresh translation audit after filter control repairs 2026-09-13 07:41:32 +03:00
Lauri Ojansivu 556992a78e Fix Wolof filter controls and due date conditions 2026-09-13 07:41:31 +03:00
Lauri Ojansivu 76788d14bb Refresh translation audit after search validation repairs 2026-09-13 07:40:56 +03:00
Lauri Ojansivu 4e007d6baa Fix Wolof search controls and operator validation messages 2026-09-13 07:40:56 +03:00
Lauri Ojansivu b17c177296 Refresh translation audit after time tracking repairs 2026-09-13 07:40:21 +03:00
Lauri Ojansivu bc8ff1ba5e Fix Wolof time tracking and remaining duration labels 2026-09-13 07:40:20 +03:00
Lauri Ojansivu c994badb64 Refresh translation audit after date rule repairs 2026-09-13 07:39:48 +03:00
Lauri Ojansivu 84ee3efbd0 Fix Wolof date rule triggers and field labels 2026-09-13 07:39:47 +03:00
Lauri Ojansivu e3f5386e5f Refresh translation audit after date time control repairs 2026-09-13 07:39:14 +03:00
Lauri Ojansivu bec90a3fc0 Fix Wolof date time controls and literal format patterns 2026-09-13 07:39:13 +03:00
Lauri Ojansivu fb2e69794f Refresh translation audit after card export repairs 2026-09-13 07:38:40 +03:00
Lauri Ojansivu 3da5d100f7 Fix Wolof card export controls and field groups 2026-09-13 07:38:39 +03:00
Lauri Ojansivu 6500cef0a4 Refresh translation audit after export metadata repairs 2026-09-13 07:38:08 +03:00
Lauri Ojansivu 1856605c97 Fix Wolof export metadata and available space labels 2026-09-13 07:38:07 +03:00
Lauri Ojansivu 57e41040aa Refresh translation progress after attachment label repairs 2026-09-13 07:37:33 +03:00
Lauri Ojansivu 59084b61ff Fix Wolof attachment labels and storage move scopes 2026-09-13 07:37:32 +03:00
Lauri Ojansivu 3e6e169b3c Refresh translation audit after comment control repairs 2026-09-13 07:36:59 +03:00
Lauri Ojansivu ed00dca314 Fix Wolof comment controls and unread comment meaning 2026-09-13 07:36:58 +03:00
Lauri Ojansivu d5074cc8ee Refresh translation audit after subtask control repairs 2026-09-13 07:36:26 +03:00
Lauri Ojansivu 9ab65727c9 Fix Wolof subtask controls and destination labels 2026-09-13 07:36:25 +03:00
Lauri Ojansivu 0627603537 Refresh translation progress after activity heading fixes 2026-09-13 07:35:48 +03:00
Lauri Ojansivu 10d6918d89 Fix Wolof activity headings and board selection hint 2026-09-13 07:35:47 +03:00
Lauri Ojansivu 43f6d087d8 Refresh translation progress after permission description repairs 2026-09-13 07:35:08 +03:00
Lauri Ojansivu 62f955fd00 Fix Wolof board permission descriptions 2026-09-13 07:35:08 +03:00
Lauri Ojansivu 1c7b55058d Refresh translation audit after workspace and archive guidance fixes 2026-09-13 07:34:33 +03:00
Lauri Ojansivu 2b9eb96222 Fix Wolof workspace title and archive guidance 2026-09-13 07:34:32 +03:00
Lauri Ojansivu 2c34515a0c Refresh translation audit after import activity repairs 2026-09-13 07:33:57 +03:00
Lauri Ojansivu 2f3a4cb25f Fix Wolof import activities and destination wording 2026-09-13 07:33:56 +03:00
Lauri Ojansivu bb3c8d3603 Update concise translation audit after membership activity repairs 2026-09-13 07:33:24 +03:00
Lauri Ojansivu c989976718 Fix Wolof joining attachment and mention activities 2026-09-13 07:33:23 +03:00
Lauri Ojansivu 83a81db9fd Refresh translation progress after custom field activity fixes 2026-09-13 07:32:48 +03:00
Lauri Ojansivu a974398a68 Fix Wolof custom field activity terminology 2026-09-13 07:32:47 +03:00
Lauri Ojansivu c8140026e2 Refresh translation audit after date activity repairs 2026-09-13 07:32:06 +03:00
Lauri Ojansivu 1544b4a0a0 Fix Wolof date activity messages and argument meaning 2026-09-13 07:32:05 +03:00
Lauri Ojansivu cd5469a2ed Update translation audit after short activity repairs 2026-09-13 07:31:28 +03:00
Lauri Ojansivu ab8313bf22 Fix Wolof short activity messages and list rename typo 2026-09-13 07:31:28 +03:00
Lauri Ojansivu e6b4f3c5a3 Refresh translation audit after account status repairs 2026-09-13 07:30:54 +03:00
Lauri Ojansivu fbdf717206 Fix Wolof account status filters and activation controls 2026-09-13 07:30:54 +03:00
Lauri Ojansivu 28ecf629c3 Refresh translation audit after starred board repairs 2026-09-13 07:30:16 +03:00
Lauri Ojansivu c3d9cac4cc Fix Wolof starred board and comment controls 2026-09-13 07:30:15 +03:00
Lauri Ojansivu d8897de0d4 Refresh translation progress after HTML and card control repairs 2026-09-13 07:29:38 +03:00
Lauri Ojansivu 9f23bb1a69 Fix Wolof HTML insertion and card addition translations 2026-09-13 07:29:37 +03:00
Lauri Ojansivu da8564f864 Update translation audit progress after storage and deletion repairs 2026-09-13 07:29:02 +03:00
Lauri Ojansivu f6fda48043 Fix Wolof deletion warnings and attachment storage translations 2026-09-13 07:29:01 +03:00
Lauri Ojansivu b06af4a920 Refresh translation repair progress after move activity fixes 2026-09-13 07:28:24 +03:00
Lauri Ojansivu af5c86c04b Fix Wolof move swimlane and checklist activity translations 2026-09-13 07:28:23 +03:00
Lauri Ojansivu 8f52ff8572 Refresh translation audit progress after archive fixes 2026-09-13 07:27:49 +03:00
Lauri Ojansivu 8cf4f44332 Fix Wolof archive action and activity translations 2026-09-13 07:27:48 +03:00
Lauri Ojansivu 4c72ac4986 Update concise translation audit after activity repairs 2026-09-13 07:27:19 +03:00
Lauri Ojansivu bcb47e2726 Fix Wolof label member and custom field activity translations 2026-09-13 07:27:18 +03:00
Lauri Ojansivu 23847c1e77 Refresh concise translation repair progress summary 2026-09-13 07:26:37 +03:00
Lauri Ojansivu 9c2607de9e Fix Wolof upload limits and file report translations 2026-09-13 07:26:30 +03:00
Lauri Ojansivu 6fd6510889 Refresh translation audit after Wolof permission label repairs 2026-09-13 07:24:19 +03:00
Lauri Ojansivu 74fe0e65e4 Repair Wolof account permission and allowed filetype labels 2026-09-13 07:24:18 +03:00
Lauri Ojansivu 5981735abf Refresh translation audit after Wolof template controls 2026-09-13 07:23:43 +03:00
Lauri Ojansivu d7d4d380ba Repair Wolof checklist template copy controls 2026-09-13 07:23:42 +03:00
Lauri Ojansivu 4a2b9fcdd4 Refresh translation audit after Wolof sorting label repairs 2026-09-13 07:23:09 +03:00
Lauri Ojansivu b05650cb4e Repair Wolof list sorting label meanings 2026-09-13 07:23:08 +03:00
Lauri Ojansivu 366fb428c7 Refresh translation audit after Wolof board display repairs 2026-09-13 07:22:34 +03:00
Lauri Ojansivu f94f4371f8 Repair Wolof board display settings and background controls 2026-09-13 07:22:34 +03:00
Lauri Ojansivu 6229e64994 Refresh translation audit after Wolof terminology review 2026-09-13 07:21:57 +03:00
Lauri Ojansivu 0bbcacd69d Correct Wolof custom field and movement terms after review 2026-09-13 07:21:56 +03:00
Lauri Ojansivu 20e7fa0629 Refresh translation audit after Wolof checked item repairs 2026-09-13 07:21:17 +03:00
Lauri Ojansivu 5684bff1d7 Repair Wolof checked item visibility and activity 2026-09-13 07:21:16 +03:00
Lauri Ojansivu 98699c6fee Refresh translation audit after Wolof checklist state repairs 2026-09-13 07:20:41 +03:00
Lauri Ojansivu 14fafd732c Repair Wolof checklist state activity distinctions 2026-09-13 07:20:41 +03:00
Lauri Ojansivu f61161be51 Refresh translation audit after Wolof checklist activity repairs 2026-09-13 07:20:06 +03:00
Lauri Ojansivu 5bfe4ff252 Repair Wolof scoped checklist activity 2026-09-13 07:20:05 +03:00
Lauri Ojansivu 10394ca868 Refresh translation audit after Wolof comment repairs 2026-09-13 07:19:30 +03:00
Lauri Ojansivu 6a4bc85895 Repair Wolof comment activity actions 2026-09-13 07:19:29 +03:00
Lauri Ojansivu 58074531fe Refresh translation audit after Wolof creation activity repairs 2026-09-13 07:18:53 +03:00
Lauri Ojansivu 64d9541bae Repair Wolof card list and board creation activity 2026-09-13 07:18:52 +03:00
Lauri Ojansivu 71e4062169 Refresh translation audit after Wolof scoped activity repairs 2026-09-13 07:18:18 +03:00
Lauri Ojansivu f6cf2dfdc6 Repair Wolof attachment and restored card activity 2026-09-13 07:18:17 +03:00
Lauri Ojansivu df581169cc Refresh translation audit after Wolof protection settings repairs 2026-09-13 07:17:39 +03:00
Lauri Ojansivu e9cb9bbf77 Repair Wolof brute force protection settings descriptions 2026-09-13 07:17:38 +03:00
Lauri Ojansivu cb4788a68c Refresh translation audit after Wolof login condition repairs 2026-09-13 07:17:07 +03:00
Lauri Ojansivu 49cbb00926 Repair Wolof login lockout conditions and account deletion label 2026-09-13 07:17:06 +03:00
Lauri Ojansivu 5c7cdd9565 Refresh translation audit after Wolof lockout repairs 2026-09-13 07:16:32 +03:00
Lauri Ojansivu c6eb570f4a Repair Wolof user account locking controls 2026-09-13 07:16:32 +03:00
Lauri Ojansivu a50b5d2163 Refresh translation audit after Wolof deletion warnings 2026-09-13 07:15:55 +03:00
Lauri Ojansivu d75dfbd47c Repair Wolof permanent deletion warnings 2026-09-13 07:15:55 +03:00
Lauri Ojansivu 291c15b336 Refresh translation audit after Wolof archive repairs 2026-09-13 07:15:20 +03:00
Lauri Ojansivu 739be477a0 Repair Wolof card and list archive recovery instructions 2026-09-13 07:15:19 +03:00
Lauri Ojansivu a8b85aaab0 Refresh translation audit after Wolof card display repairs 2026-09-13 07:14:44 +03:00
Lauri Ojansivu 784dc5b924 Repair Wolof list movement and card display controls 2026-09-13 07:14:44 +03:00
Lauri Ojansivu 406cd56719 Refresh translation audit after Wolof attachment repairs 2026-09-13 07:14:11 +03:00
Lauri Ojansivu dfec89d0b9 Repair Wolof attachment controls and activity 2026-09-13 07:14:10 +03:00
Lauri Ojansivu 16a26a52f1 Refresh translation audit after Wolof date label repairs 2026-09-13 07:13:35 +03:00
Lauri Ojansivu c66df192bc Repair Wolof calendar navigation and date labels 2026-09-13 07:13:35 +03:00
Lauri Ojansivu 312ea2f46c Refresh translation audit after Wolof keyboard help repairs 2026-09-13 07:12:56 +03:00
Lauri Ojansivu 5730e2dda7 Repair Wolof keyboard shortcut descriptions 2026-09-13 07:12:55 +03:00
Lauri Ojansivu 41f9c49526 Refresh translation audit after Wolof workspace repairs 2026-09-13 07:12:14 +03:00
Lauri Ojansivu fbcace52d5 Repair Wolof workspace controls and confirmations 2026-09-13 07:12:13 +03:00
Lauri Ojansivu 4d4535555f Refresh translation audit after Wolof search limit repairs 2026-09-13 07:11:41 +03:00
Lauri Ojansivu 5efe267949 Repair Wolof search age sorting and result limit instructions 2026-09-13 07:11:40 +03:00
Lauri Ojansivu c4b80e23e4 Refresh translation audit after Wolof search syntax repairs 2026-09-13 07:11:05 +03:00
Lauri Ojansivu 3e850c3e41 Repair Wolof search criteria and shorthand examples 2026-09-13 07:11:04 +03:00
Lauri Ojansivu 4e67690c00 Refresh translation audit after Wolof filter repairs 2026-09-13 07:10:30 +03:00
Lauri Ojansivu 7f7b98958b Repair Wolof filter criterion labels 2026-09-13 07:10:29 +03:00
Lauri Ojansivu 07f679360c Refresh translation audit after Wolof label terminology review 2026-09-13 07:09:57 +03:00
Lauri Ojansivu a0459fcb74 Unify Wolof label terminology and repair visibility meanings 2026-09-13 07:09:56 +03:00
Lauri Ojansivu c53f2f2c3f Refresh translation audit after Wolof label repairs 2026-09-13 07:09:22 +03:00
Lauri Ojansivu c7a6711355 Repair Wolof label controls and error meanings 2026-09-13 07:09:21 +03:00
Lauri Ojansivu 6c38a395e6 Refresh translation audit after Wolof visibility repairs 2026-09-13 07:08:47 +03:00
Lauri Ojansivu 2c6974a393 Repair Wolof card visibility and field scope controls 2026-09-13 07:08:46 +03:00
Lauri Ojansivu 058a0f3fdb Refresh translation audit after Wolof card copy repairs 2026-09-13 07:08:06 +03:00
Lauri Ojansivu 738712731d Repair Wolof multiple card copy instructions and JSON example 2026-09-13 07:08:05 +03:00
Lauri Ojansivu a1636fb5d4 Refresh translation audit after Wolof assignee search repairs 2026-09-13 07:07:33 +03:00
Lauri Ojansivu 23ab711d74 Repair Wolof assignee search and member import instructions 2026-09-13 07:07:33 +03:00
Lauri Ojansivu c4a43804c7 Refresh translation audit after Wolof membership repairs 2026-09-13 07:06:55 +03:00
Lauri Ojansivu 1bb9fdda4b Repair Wolof board and card membership controls 2026-09-13 07:06:54 +03:00
Lauri Ojansivu 8206d3869c Refresh translation audit after Wolof checklist input repairs 2026-09-13 07:06:15 +03:00
Lauri Ojansivu 55d8c545ae Repair Wolof checklist completion and input instructions 2026-09-13 07:06:14 +03:00
Lauri Ojansivu 0bf9e4a658 Refresh translation audit after Wolof checklist repairs 2026-09-13 07:05:42 +03:00
Lauri Ojansivu dbb053821e Repair Wolof checklist actions and warnings 2026-09-13 07:05:41 +03:00
Lauri Ojansivu ea304b1402 Refresh translation audit after Wolof activity repairs 2026-09-13 07:05:09 +03:00
Lauri Ojansivu ecbec0f2c9 Repair Wolof card placement and activity labels 2026-09-13 07:05:08 +03:00
Lauri Ojansivu f30f2101ec Record unresolved Silesian technical wording review 2026-09-13 07:04:20 +03:00
Lauri Ojansivu 7107e992c4 Refresh translation audit after Walloon agreement review 2026-09-13 07:03:49 +03:00
Lauri Ojansivu 595bdd256a Correct Walloon card creation agreement after review 2026-09-13 07:03:48 +03:00
Lauri Ojansivu a720f519f3 Refresh translation audit after Walloon calendar replacements 2026-09-13 07:03:07 +03:00
Lauri Ojansivu 08c9209300 Translate Walloon Hijri calendar variant labels 2026-09-13 07:03:06 +03:00
Lauri Ojansivu 7a6ca99c94 Refresh translation audit after Walloon state label repairs 2026-09-13 07:02:29 +03:00
Lauri Ojansivu 4258f59419 Repair Walloon example and checkbox state labels 2026-09-13 07:02:28 +03:00
Lauri Ojansivu f67062acd3 Refresh translation audit after Walloon authentication repairs 2026-09-13 07:01:53 +03:00
Lauri Ojansivu dee5b46ddc Repair Walloon authentication labels 2026-09-13 07:01:52 +03:00
Lauri Ojansivu 9d378064a1 Refresh translation audit after Walloon diagnostic repairs 2026-09-13 07:01:22 +03:00
Lauri Ojansivu 86526a56d0 Repair remaining Walloon heap and uptime diagnostics 2026-09-13 07:01:21 +03:00
Lauri Ojansivu f951a4156f Refresh translation audit after Walloon memory repairs 2026-09-13 07:00:47 +03:00
Lauri Ojansivu 5bad62d6c3 Repair Walloon memory diagnostic labels 2026-09-13 07:00:46 +03:00
Lauri Ojansivu 9cae22d6b1 Refresh translation audit after Walloon filter repairs 2026-09-13 07:00:00 +03:00
Lauri Ojansivu d1b0cf9a88 Repair Walloon advanced filter and URL scheme instructions 2026-09-13 06:59:59 +03:00
Lauri Ojansivu 8a71d64049 Refresh translation audit after Walloon animation repairs 2026-09-13 06:59:14 +03:00
Lauri Ojansivu 18308b4767 Repair Walloon waiting animation labels 2026-09-13 06:59:13 +03:00
Lauri Ojansivu 2cf5792300 Refresh translation audit after Walloon member mapping repairs 2026-09-13 06:58:35 +03:00
Lauri Ojansivu 017f79fa8f Repair Walloon selection and imported member instructions 2026-09-13 06:58:34 +03:00
Lauri Ojansivu cfcb875e28 Refresh translation audit after Walloon archive repairs 2026-09-13 06:57:57 +03:00
Lauri Ojansivu 31baf4ae37 Repair Walloon archive controls and linked card warnings 2026-09-13 06:57:56 +03:00
Lauri Ojansivu 3e0300439c Refresh translation audit after Walloon workspace repairs 2026-09-13 06:57:10 +03:00
Lauri Ojansivu 06d4228177 Repair Walloon workspace labels and card copy example 2026-09-13 06:57:09 +03:00
Lauri Ojansivu 5cb11aee34 Refresh translation audit after Walloon checkbox repairs 2026-09-13 06:56:32 +03:00
Lauri Ojansivu 36eec86be2 Repair Walloon checkbox activities and controls 2026-09-13 06:56:32 +03:00
Lauri Ojansivu 6bfd1e7230 Refresh short translation audit after Walloon upload repairs 2026-09-13 06:53:52 +03:00
Lauri Ojansivu 355febf8c0 Repair Walloon layout and upload controls
Translate 21 audited values, retaining vertical direction, label ranges and WIP threshold. Full grammar and specialized terminology remain low confidence.
2026-09-13 06:53:42 +03:00
Lauri Ojansivu b7f84c8ca4 Refresh short translation audit after Walloon calendar labels 2026-09-13 06:52:53 +03:00
Lauri Ojansivu fe809d070b Translate remaining basic Walloon calendar labels
Repair 13 audited values while retaining calendar names. Specialized religious and country adjectives remain low confidence and need further terminology review.
2026-09-13 06:52:42 +03:00
Lauri Ojansivu 720b18f189 Refresh short translation audit after Walloon support repairs 2026-09-13 06:52:00 +03:00
Lauri Ojansivu 94582b01e5 Repair Walloon support and layout translations
Translate 25 audited values while retaining diagnostic commands, layout limits and SMTP identifiers. Full grammar and specialized terminology remain low confidence.
2026-09-13 06:51:50 +03:00
Lauri Ojansivu 181fdb636f Refresh short translation audit after Walloon filter repairs 2026-09-13 06:51:11 +03:00
Lauri Ojansivu 85a9598f6f Repair Walloon filtering and selection translations
Translate 30 audited values, retaining role distinctions, selection scope and operator placeholders. Full grammar and filtering terminology remain low confidence.
2026-09-13 06:51:00 +03:00
Lauri Ojansivu 81c36ebae3 Refresh short translation audit after Walloon customization repairs 2026-09-13 06:50:23 +03:00
Lauri Ojansivu e125e16bf9 Repair Walloon customization and scheduled job translations
Translate 32 audited values, preserving web identifiers, default dimensions and success/failure states. Full grammar and specialized terminology remain low confidence.
2026-09-13 06:50:13 +03:00
Lauri Ojansivu d6ca4cb6bb Record Walloon clipboard terminology re-review in short audit 2026-09-13 06:49:34 +03:00
Lauri Ojansivu 010cc88fc3 Correct unsupported Walloon clipboard terminology
Replace magic-hat wording in four values with attested presse-papî and add regression coverage. Full surrounding grammar remains low confidence.
2026-09-13 06:49:24 +03:00
Lauri Ojansivu 787c682d1f Refresh short translation audit after Walloon display repairs 2026-09-13 06:48:44 +03:00
Lauri Ojansivu 3ac699ac30 Repair Walloon field and display translations
Translate 27 audited values, retaining size tokens, width actions and sort order. Full grammar and specialized terminology remain low confidence.
2026-09-13 06:48:32 +03:00
Lauri Ojansivu f62862f513 Refresh short translation audit after Walloon date activity repairs 2026-09-13 06:47:55 +03:00
Lauri Ojansivu 62d15364e0 Repair Walloon date activity and accessibility controls
Translate 22 audited values, preserving date states, argument order and due-card permission scope. Full grammar and specialized terminology remain low confidence.
2026-09-13 06:47:44 +03:00
Lauri Ojansivu 82d4596b50 Refresh short translation audit after Walloon search instructions 2026-09-13 06:47:09 +03:00
Lauri Ojansivu 93fb273e72 Repair Walloon search instructions and card controls
Translate 22 audited values while retaining OR/AND examples and removal scope. Full grammar and specialized search terminology remain low confidence.
2026-09-13 06:47:08 +03:00
Lauri Ojansivu a05b7e0598 Refresh short translation audit after Walloon search repairs 2026-09-13 06:46:10 +03:00
Lauri Ojansivu 0400e5a8b1 Repair Walloon search operator help
Translate 28 audited values, preserving operator tokens and distinct user roles. Full grammar and search terminology remain low confidence.
2026-09-13 06:45:57 +03:00
Lauri Ojansivu c2666a85e6 Refresh short translation audit after Walloon email repairs 2026-09-13 06:45:13 +03:00
Lauri Ojansivu 8e8600a2b3 Repair Walloon invitation and email translations
Translate 25 audited values, retaining links, invitation codes and offline data-loss warning. Full grammar and invitation terminology remain low confidence.
2026-09-13 06:45:12 +03:00
Lauri Ojansivu b238dbd2d4 Refresh short translation audit after Walloon rule repairs 2026-09-13 06:44:11 +03:00
Lauri Ojansivu 8f7ae964dd Repair Walloon rule and workspace translations
Translate 26 audited values, preserving movement directions, WIP scope and notification states. Full grammar and rule/notification terminology remain low confidence.
2026-09-13 06:44:00 +03:00
Lauri Ojansivu fd1dbb29d8 Refresh short translation audit after Walloon board action repairs 2026-09-13 06:43:19 +03:00
Lauri Ojansivu 5bccb17b97 Repair Walloon board and card action translations
Translate 29 audited values, preserving member/admin requirements and action scope. Full grammar and template-container terminology remain low confidence.
2026-09-13 06:43:09 +03:00
Lauri Ojansivu 86c6ce3952 Refresh short translation audit after Walloon account repairs 2026-09-13 06:42:33 +03:00
Lauri Ojansivu 05a171284b Repair Walloon account and login translations
Translate 24 audited values, preserving failed login protection, seconds and activation actions. Full grammar and security terminology remain low confidence.
2026-09-13 06:42:23 +03:00
Lauri Ojansivu 345902bc1c Refresh short translation audit after Walloon shortcut repairs 2026-09-13 06:41:47 +03:00
Lauri Ojansivu 2ab1fd7470 Repair Walloon shortcut and display controls
Translate 20 audited values, preserving zoom range and enabled/disabled actions. Full grammar and autocomplete terminology remain low confidence.
2026-09-13 06:41:36 +03:00
Lauri Ojansivu 165899c594 Refresh short translation audit after Walloon import repairs 2026-09-13 06:41:02 +03:00
Lauri Ojansivu 48cf4e2bdc Repair Walloon import and member mapping controls
Translate 16 audited values while retaining menu labels, file formats and current-user fallback. Full grammar and mapping terminology remain low confidence.
2026-09-13 06:41:01 +03:00
Lauri Ojansivu a9072b57d0 Refresh short translation audit after Walloon export repairs 2026-09-13 06:40:03 +03:00
Lauri Ojansivu b53c48f822 Repair Walloon export and file controls
Translate 18 audited values while preserving formats, byte units and field groups. Full grammar and specialized field terminology remain low confidence.
2026-09-13 06:40:03 +03:00
Lauri Ojansivu e796971ec1 Refresh short translation audit after Walloon migration descriptions 2026-09-13 06:39:01 +03:00
Lauri Ojansivu e1e92dd7e3 Repair Walloon migration descriptions and confirmations
Translate 20 audited values, retaining duplicate deletion conditions, archived state restrictions and database identifiers. Full grammar and data-integrity terminology remain low confidence.
2026-09-13 06:39:00 +03:00
Lauri Ojansivu a1de404212 Refresh short translation audit after Walloon migration repairs 2026-09-13 06:38:05 +03:00
Lauri Ojansivu 87685a0733 Repair Walloon migration and data repair controls
Translate 29 audited values, preserving affected data and paused/failed migration states. Full grammar and migration terminology remain low confidence.
2026-09-13 06:37:54 +03:00
Lauri Ojansivu 51725bf854 Refresh short translation audit after Walloon field repairs 2026-09-13 06:37:12 +03:00
Lauri Ojansivu 9494b94544 Repair Walloon custom field and description translations
Translate 15 audited controls, preserving format placeholders, whitespace entities and HTML tags. Full grammar and template terminology remain low confidence.
2026-09-13 06:37:02 +03:00
Lauri Ojansivu 4e4792c774 Refresh short translation audit after Walloon date repairs 2026-09-13 06:36:29 +03:00
Lauri Ojansivu 2eb417eb6a Repair Walloon date controls and date activity translations
Translate 19 audited date values and two adjacent month controls. Preserve date/card argument order and date types. Received-date terminology, deadline loan and grammar remain low confidence.
2026-09-13 06:36:28 +03:00
Lauri Ojansivu 7db8398377 Refresh short translation audit after Walloon archive repairs 2026-09-13 06:35:33 +03:00
Lauri Ojansivu 9c18ffd593 Repair Walloon deletion and archive warnings
Translate 23 audited values while retaining deleted objects, no-undo warnings and archive recovery. Full grammar and technical history terminology remain low confidence.
2026-09-13 06:35:24 +03:00
Lauri Ojansivu 511421e663 Refresh short translation audit after Walloon control repairs 2026-09-13 06:34:38 +03:00
Lauri Ojansivu ee82f12fd2 Repair Walloon card controls and deletion confirmations
Translate 22 audited values, preserving direction, archive alternatives and irreversible deletion warnings. Full sentence grammar remains low confidence.
2026-09-13 06:34:37 +03:00
Lauri Ojansivu aa8918acbc Refresh short translation audit after Walloon permission repairs 2026-09-13 06:33:48 +03:00
Lauri Ojansivu 4973f7d1b6 Repair Walloon member and permission translations
Translate 24 audited values while preserving role restrictions and prohibitions. Full grammar and specialized assignment phrasing remain low confidence.
2026-09-13 06:33:47 +03:00
Lauri Ojansivu ab61dcf5fb Refresh short translation audit after Walloon checklist repairs 2026-09-13 06:32:44 +03:00
Lauri Ojansivu adf472f58f Repair French checklist translations in Walloon
Translate 21 audited checklist values, preserving item removal and completed/uncompleted meanings. Use attested feminine fineye. Full sentence grammar remains low confidence.
2026-09-13 06:32:33 +03:00
Lauri Ojansivu 381faf7d19 Refresh short translation audit after Walloon activity repairs 2026-09-13 06:31:45 +03:00
Lauri Ojansivu efa519e632 Repair French activity messages in Walloon translations
Translate 29 activity values, preserving complete context placeholders and movement origins and destinations. Full sentence grammar remains low confidence.
2026-09-13 06:31:44 +03:00
Lauri Ojansivu 9b55cc721a Refresh short translation audit after Walloon attachment repairs 2026-09-13 06:30:39 +03:00
Lauri Ojansivu ee13ed8638 Repair Walloon attachment, minicard and activity translations
Replace 34 audited French values with Walloon, retaining storage names and activity placeholders. Sentence grammar remains low confidence.
2026-09-13 06:30:30 +03:00
Lauri Ojansivu f41fc70c58 Refresh short translation audit after Walloon lockout repairs 2026-09-13 06:29:32 +03:00
Lauri Ojansivu a6ac30b351 Repair French account lockout labels in Walloon translations
Use attested Walloon user, password, settings and block/unblock vocabulary. Sentence grammar remains low confidence.
2026-09-13 06:29:23 +03:00
Lauri Ojansivu 8d5de7ed01 Keep short translation audit summary synchronized with repair records 2026-09-13 06:28:29 +03:00
Lauri Ojansivu 3511bf3783 Refresh concise translation repair progress 2026-09-13 06:25:35 +03:00
Lauri Ojansivu 1b08e22a40 Translate Samoan astronomical Hijri starting-date label 2026-09-13 06:25:34 +03:00
Lauri Ojansivu 7fd1663b33 Refresh concise translation repair progress 2026-09-13 06:25:01 +03:00
Lauri Ojansivu ac0617f357 Restore moon sighting in Samoan Saudi Hijri label 2026-09-13 06:25:01 +03:00
Lauri Ojansivu 3f99653bb6 Refresh concise translation repair progress 2026-09-13 06:24:27 +03:00
Lauri Ojansivu e40590278b Translate Samoan Buddhist and Coptic calendar labels 2026-09-13 06:24:27 +03:00
Lauri Ojansivu 78243676fb Refresh concise translation repair progress 2026-09-13 06:23:53 +03:00
Lauri Ojansivu d7f5d685f1 Repair Samoan calendar system and named calendar labels 2026-09-13 06:23:53 +03:00
Lauri Ojansivu eb93a708a5 Refresh concise translation repair progress 2026-09-13 06:22:57 +03:00
Lauri Ojansivu 48ad0bae62 Translate Shona astronomical Hijri starting-date label 2026-09-13 06:22:57 +03:00
Lauri Ojansivu 2bc83a7d50 Refresh concise translation repair progress 2026-09-13 06:22:23 +03:00
Lauri Ojansivu d7d55859ce Restore moon sighting in Shona Saudi Hijri label 2026-09-13 06:22:23 +03:00
Lauri Ojansivu a91dd73d8f Refresh concise translation repair progress 2026-09-13 06:21:50 +03:00
Lauri Ojansivu b9d8f621ba Translate Shona Coptic and Hijri calendar labels 2026-09-13 06:21:50 +03:00
Lauri Ojansivu 2ce5c518a9 Refresh concise translation repair progress 2026-09-13 06:21:12 +03:00
Lauri Ojansivu 0e0c46be08 Translate Shona named calendar descriptions 2026-09-13 06:21:12 +03:00
Lauri Ojansivu 549f9dfa51 Refresh concise translation repair progress 2026-09-13 06:20:34 +03:00
Lauri Ojansivu 6b9a982764 Repair Shona calendar labels and remove translation meta-text 2026-09-13 06:20:33 +03:00
Lauri Ojansivu d9ef919c96 Refresh concise translation repair progress 2026-09-13 06:19:44 +03:00
Lauri Ojansivu c34390fdcf Restore moon sighting in Chichewa Saudi Hijri label 2026-09-13 06:19:44 +03:00
Lauri Ojansivu 609995794c Refresh concise translation repair progress 2026-09-13 06:18:46 +03:00
Lauri Ojansivu b498f6c8fb Repair Chichewa Persian and astronomical Hijri labels 2026-09-13 06:18:45 +03:00
Lauri Ojansivu f6b8f45748 Refresh concise translation repair progress 2026-09-13 06:18:02 +03:00
Lauri Ojansivu 953f6122d9 Translate Chichewa Buddhist and Coptic calendar labels 2026-09-13 06:18:02 +03:00
Lauri Ojansivu 5d0164dde8 Refresh concise translation repair progress 2026-09-13 06:17:22 +03:00
Lauri Ojansivu b944e56f03 Repair Chichewa calendar system and named calendar labels 2026-09-13 06:17:21 +03:00
Lauri Ojansivu 35299caec5 Refresh concise translation repair progress 2026-09-13 06:16:30 +03:00
Lauri Ojansivu 9620b33212 Distinguish Oromo Hijri calendar variants 2026-09-13 06:16:30 +03:00
Lauri Ojansivu 600047b5e0 Refresh concise translation repair progress 2026-09-13 06:15:29 +03:00
Lauri Ojansivu 2f2b7f06fb Translate Oromo Buddhist and Coptic calendar labels 2026-09-13 06:15:29 +03:00
Lauri Ojansivu 121a5d577d Refresh concise translation repair progress 2026-09-13 06:15:04 +03:00
Lauri Ojansivu 4a8f1f9922 Repair Oromo religious calendar and era names 2026-09-13 06:15:03 +03:00
Lauri Ojansivu 53d12febcc Refresh concise translation repair progress 2026-09-13 06:14:12 +03:00
Lauri Ojansivu 0ce0c5dd8f Repair Oromo calendar system and country labels 2026-09-13 06:14:11 +03:00
Lauri Ojansivu 985276a780 Refresh concise translation repair progress 2026-09-13 06:13:38 +03:00
Lauri Ojansivu a92c35ecae Repair Acehnese clipboard copy labels 2026-09-13 06:13:27 +03:00
Lauri Ojansivu fa8b7455bb Refresh concise translation repair progress 2026-09-13 06:10:25 +03:00
Lauri Ojansivu e6be5b22dd Repair Acehnese filter help and raw database labels
Translate filter prose while preserving operators, examples and exact escape sequences. Use dictionary-supported raw terminology. Specialized wording and grammar remain low confidence pending native-speaker review.
2026-09-13 06:10:25 +03:00
Lauri Ojansivu 09c82217ce Refresh concise translation repair progress 2026-09-13 06:09:20 +03:00
Lauri Ojansivu 626ccb7ff8 Repair Acehnese calendar selection labels
Use dictionary-supported Persian, Chinese, Japanese and Jewish names. Preserve named calendars, civil and astronomical epochs and Saudi lunar observation. Specialized calendar terminology and grammar remain low confidence pending native-speaker review.
2026-09-13 06:09:19 +03:00
Lauri Ojansivu 1fe089da28 Refresh concise translation repair progress 2026-09-13 06:08:33 +03:00
Lauri Ojansivu cbd3e7ae41 Repair Acehnese calendar, activity and account labels
Replace Azerbaijani calendar-setting text and align the calendar heading. Preserve activity placeholders and URL scheme instructions. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 06:08:32 +03:00
Lauri Ojansivu 69a3d08a3e Refresh concise translation repair progress 2026-09-13 06:07:50 +03:00
Lauri Ojansivu 51961c5180 Repair Acehnese memory diagnostics and waiting animations
Preserve Node, MongoDB and animation identifiers. Distinguish allocated, used, available, executable and resident memory, and describe zap as bit-pattern overwriting. Specialized terminology and grammar remain low confidence pending native-speaker review.
2026-09-13 06:07:50 +03:00
Lauri Ojansivu 66f6a5ef1f Refresh concise translation repair progress 2026-09-13 06:06:55 +03:00
Lauri Ojansivu 5567d8b7ac Repair Acehnese WIP and export messages
Correct movement out of a list and the truncated Excel format name. Preserve authentication optionality, worker restrictions and deletion warnings. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 06:06:55 +03:00
Lauri Ojansivu 8de9aa596d Refresh concise translation repair progress 2026-09-13 06:05:58 +03:00
Lauri Ojansivu cd92d1aae1 Repair Acehnese SMTP and field summary labels
Distinguish sums and counts, preserve hour units and positive-integer height requirements, and retain notification restrictions. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 06:05:58 +03:00
Lauri Ojansivu 48e0a2f8c2 Refresh concise translation repair progress 2026-09-13 06:04:57 +03:00
Lauri Ojansivu 2728e77851 Repair Acehnese shortcuts and display settings
Distinguish card membership from assignment and preserve diagnostic commands. Restore subtasks and field display wording. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 06:04:56 +03:00
Lauri Ojansivu 2d767feb6a Refresh concise translation repair progress 2026-09-13 06:04:05 +03:00
Lauri Ojansivu 58054be459 Repair Acehnese role and removal messages
Preserve read-only restrictions, label shortcut range and unsaved description replacement semantics. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 06:04:05 +03:00
Lauri Ojansivu 468c6a0573 Refresh concise translation repair progress 2026-09-13 06:03:12 +03:00
Lauri Ojansivu d69ac5a712 Repair Acehnese automation rule messages
Correct top versus bottom movement and distinguish checking from unchecking. Preserve rule conditions and placeholders. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 06:03:12 +03:00
Lauri Ojansivu f8b1d65f2a Refresh concise translation repair progress 2026-09-13 06:02:14 +03:00
Lauri Ojansivu 5893dd30f6 Repair Acehnese notifications and board visibility messages
Preserve tentative private-page wording, login HTML links, board editing restrictions and card-window behavior. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 06:02:14 +03:00
Lauri Ojansivu 8868f6b84f Refresh concise translation repair progress 2026-09-13 06:01:22 +03:00
Lauri Ojansivu 378b2a48c0 Repair Acehnese member mapping and attachment settings
Preserve imported member roles and permission limits, byte-based upload limits and attachment destinations. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 06:01:21 +03:00
Lauri Ojansivu 4f5eba7305 Refresh concise translation repair progress 2026-09-13 06:00:40 +03:00
Lauri Ojansivu 86f4ae1310 Repair Acehnese keyboard states and list warnings
Correct duplicated enabled/disabled shortcut labels and roles versus rules in last-admin restrictions. Preserve archive restoration and deletion semantics. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 06:00:39 +03:00
Lauri Ojansivu 7aab51b245 Refresh concise translation repair progress 2026-09-13 05:59:50 +03:00
Lauri Ojansivu 2d47d8fabd Repair Acehnese import and user mapping instructions
Preserve Trello menu labels, supported file formats and current-user mapping semantics. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 05:59:49 +03:00
Lauri Ojansivu 51489e012f Refresh concise translation repair progress 2026-09-13 05:58:59 +03:00
Lauri Ojansivu 349b56826c Repair Acehnese filters and search instructions
Correct case-insensitive search, creator versus assignee wording and the one-board home limit. Preserve search placeholders and number syntax. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 05:58:58 +03:00
Lauri Ojansivu 2503de754f Refresh concise translation repair progress 2026-09-13 05:58:08 +03:00
Lauri Ojansivu 8e1e8604a0 Repair Acehnese validation and export messages
Correct vertical scrolling versus horizontal wording and preserve the zoom range. Keep invalid formats, permissions and existing-name errors distinct. Grammar and technical terms remain low confidence pending native-speaker review.
2026-09-13 05:58:08 +03:00
Lauri Ojansivu 86b0316aa7 Refresh concise translation repair progress 2026-09-13 05:57:18 +03:00
Lauri Ojansivu 28d38ae872 Repair Acehnese account emails and permission errors
Preserve recipient, site and URL placeholders and email paragraph breaks. Keep membership and administrator requirements distinct. Grammar and adapted technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 05:57:18 +03:00
Lauri Ojansivu 562a74fc5f Refresh concise translation repair progress 2026-09-13 05:56:33 +03:00
Lauri Ojansivu 50896edea1 Repair Acehnese deletion and subtask destination messages
Preserve linked-card deletion conditions, membership restrictions and archive loss warnings. Grammar and technical wording remain low confidence pending native-speaker review.
2026-09-13 05:56:33 +03:00
Lauri Ojansivu 9b05b27103 Refresh concise translation repair progress 2026-09-13 05:55:36 +03:00
Lauri Ojansivu 30e24fbd2d Repair Acehnese custom-field and creation-date labels
Preserve format placeholders, whitespace entities and logo defaults. Add entity preservation regression coverage. Grammar and borrowed technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 05:55:35 +03:00
Lauri Ojansivu 48401b04d1 Refresh concise translation repair progress 2026-09-13 05:54:44 +03:00
Lauri Ojansivu 5235927d30 Repair Acehnese card and checklist controls
Distinguish automatic list width from default width and preserve clipboard, template-copy and archive-restoration behavior. Grammar and adapted technical vocabulary remain low confidence pending native-speaker review.
2026-09-13 05:54:43 +03:00
Lauri Ojansivu d801634f47 Refresh concise translation repair progress 2026-09-13 05:54:00 +03:00
Lauri Ojansivu f0dcd4536e Repair Acehnese permissions and card deletion warnings
Distinguish avatar and upload file types, sorting and filtering, archive restoration and irreversible deletion. Preserve source placeholders. Grammar and borrowed technical terminology remain low confidence pending native-speaker review.
2026-09-13 05:54:00 +03:00
Lauri Ojansivu f188049393 Refresh concise translation repair progress 2026-09-13 05:53:13 +03:00
Lauri Ojansivu 679a254538 Repair Acehnese warnings and board visibility markup
Fix board versus card wording and broken strong tags. Cover HTML tag preservation and malformed markup regressions. Grammar and borrowed technical terminology remain low confidence pending native-speaker review.
2026-09-13 05:53:13 +03:00
Lauri Ojansivu 294a0d25ef Refresh concise translation repair progress 2026-09-13 05:52:21 +03:00
Lauri Ojansivu 406dbc482a Repair Acehnese HTML, archive and attachment labels
Preserve HTML tags and the before/after insertion distinction. Replace foreign-language surrounding text using existing Acehnese terminology and dictionary vocabulary. Grammar and borrowed technical terms remain low confidence pending native-speaker review.
2026-09-13 05:52:20 +03:00
Lauri Ojansivu 8976ad46bf Refresh concise translation repair progress 2026-09-13 05:51:38 +03:00
Lauri Ojansivu e9b9457c25 Repair Acehnese activity and background image labels
Preserve activity argument order and distinguish clearing a field value from deleting its definition. Use dictionary-supported name, image and position vocabulary. Grammar and borrowed technical terms remain low confidence pending native-speaker review.
2026-09-13 05:51:37 +03:00
Lauri Ojansivu 00b0cdd2c4 Refresh concise translation repair progress 2026-09-13 05:50:55 +03:00
Lauri Ojansivu 93dabed102 Repair Acehnese card and board activity translations
Replace Malay and Indonesian activity wording using existing Acehnese terminology and dictionary-supported creation and movement verbs. Preserve every source placeholder. Grammar and borrowed technical vocabulary remain low confidence and need native-speaker review.
2026-09-13 05:50:55 +03:00
Lauri Ojansivu 3f0f6b6a52 Refresh concise translation repair progress 2026-09-13 05:50:03 +03:00
Lauri Ojansivu d8291680ac Clarify maximum permitted heap size in Silesian
Preserve the distinction between allocated memory and the maximum heap size. Technical terminology remains subject to native-speaker review.
2026-09-13 05:50:02 +03:00
Lauri Ojansivu 563efdb3e6 Refresh concise translation repair progress 2026-09-13 05:48:57 +03:00
Lauri Ojansivu 37f06a9a7f Repair Silesian memory, reactivity and archived-card labels
Preserve search placeholders and reactivity backend identifiers. Specialized Silesian terminology remains subject to native-speaker review.
2026-09-13 05:48:57 +03:00
Lauri Ojansivu 63c7ff8c02 Refresh concise translation repair progress 2026-09-13 05:48:23 +03:00
Lauri Ojansivu 52a946b17a Correct Silesian heap overwrite diagnostic terminology
Describe bit-pattern overwriting rather than garbage collection. Silesian technical wording remains subject to native-speaker review.
2026-09-13 05:48:11 +03:00
Lauri Ojansivu b83112b1f8 Refresh concise translation audit progress 2026-09-13 05:45:32 +03:00
Lauri Ojansivu 91f0d401d7 Repair Silesian calendar names and Hijri variants
Replace fifteen English calendar findings, preserving Dangi, Amete Alem, Minguo and Umm al-Qura names. Distinguish civil and astronomical epochs and Saudi lunar sighting. Specialized terminology and grammar require native-language review.
2026-09-13 05:45:31 +03:00
Lauri Ojansivu 742432448e Refresh short translation audit progress 2026-09-13 05:44:54 +03:00
Lauri Ojansivu e352ac470a Repair Silesian Trello credentials and validation labels
Replace twelve Polish findings, preserving API, URL and WIP identifiers. Restore integer height requirements and authentication rather than authorization wording. Specialized terminology and grammar require native-language review.
2026-09-13 05:44:53 +03:00
Lauri Ojansivu 08b67c53d7 Refresh short translation audit progress 2026-09-13 05:44:19 +03:00
Lauri Ojansivu e680c3fdc1 Repair Silesian shortcut and migration step labels
Replace twelve Polish findings, correcting shortcut list display rather than pinning. Preserve WIP, Lost Cards and shared versus per-swimlane meanings. Specialized terminology and grammar require native-language review.
2026-09-13 05:44:18 +03:00
Lauri Ojansivu 792a7f20c0 Refresh concise translation audit progress 2026-09-13 05:43:45 +03:00
Lauri Ojansivu 6b843e340d Repair Silesian S3 descriptions and WIP controls
Replace eleven Polish findings, preserving storage provider names, region example, SSL/TLS and WIP identifiers. Shared raw database file wording remains pending review. Specialized terminology and grammar require native-language review.
2026-09-13 05:43:45 +03:00
Lauri Ojansivu 28653de093 Refresh short translation audit progress 2026-09-13 05:43:09 +03:00
Lauri Ojansivu 1b458f811e Repair Silesian recovery and storage labels
Replace twelve Polish findings, preserving recovery text-data scope, provider names, S3 access key identity and blank AWS endpoint fallback. Specialized terminology and grammar require native-language review.
2026-09-13 05:43:09 +03:00
Lauri Ojansivu 29464b3ed0 Refresh short translation audit summary 2026-09-13 05:42:34 +03:00
Lauri Ojansivu 15a8883448 Repair Silesian automation actions and triggers
Replace twelve Polish findings, preserving Trello Butler naming, comma-separated examples and complete/incomplete distinctions. Describe trigger events in the present rather than future tense. Specialized terminology and grammar require native-language review.
2026-09-13 05:42:34 +03:00
Lauri Ojansivu 7c6d8e56bf Refresh concise translation audit summary 2026-09-13 05:42:00 +03:00
Lauri Ojansivu 1ecb916576 Repair Silesian compact and template settings
Replace twelve Polish findings, preserving MongoDB compact identity, OIDC and operator placeholders. Clarify one line per checklist item and blank-field matching. Specialized terminology and grammar require native-language review.
2026-09-13 05:42:00 +03:00
Lauri Ojansivu 9ee7a1921d Refresh concise translation audit summary 2026-09-13 05:41:26 +03:00
Lauri Ojansivu 4af6360fa3 Repair Silesian list and migration settings
Replace twelve Polish findings, preserving strict width and CPU threshold limits, product names and pause versus stop meanings. Specialized terminology and grammar require native-language review.
2026-09-13 05:41:25 +03:00
Lauri Ojansivu 5b4c662d1d Refresh concise translation audit progress 2026-09-13 05:40:52 +03:00
Lauri Ojansivu 5dc5927358 Repair Silesian search views and import status labels
Replace eleven Polish findings, preserving search/import placeholders, downloader product name and domain example. Retain opposite shortcut states. Shared archived-card wording remains pending review; specialized grammar needs native-language review.
2026-09-13 05:40:52 +03:00
Lauri Ojansivu 9b02763563 Refresh concise translation audit progress 2026-09-13 05:40:17 +03:00
Lauri Ojansivu 791d9b0ce5 Repair Silesian service credentials and search labels
Replace twelve Polish findings, preserving Google Cloud menu labels, JSON/URL names and search operator tokens. Clarify title matching rather than matching a search key. Specialized terminology and grammar require native-language review.
2026-09-13 05:40:17 +03:00
Lauri Ojansivu 554fe8e24d Refresh short translation audit progress 2026-09-13 05:39:43 +03:00
Lauri Ojansivu 1e1e440c87 Repair Silesian drag controls and filter labels
Replace twelve Polish findings, preserving due-change and email placeholders, zoom limits and custom-field/filter distinctions. Specialized terminology and grammar require native-language review.
2026-09-13 05:39:42 +03:00
Lauri Ojansivu ca5a58f70e Refresh concise translation repair progress 2026-09-13 05:39:10 +03:00
Lauri Ojansivu 1dc267f06a Repair Silesian custom content and authentication settings
Replace twelve Polish findings, preserving assetlinks.json, JSON, URL and database product/version names. Retain text-data migration scope. Specialized terminology and grammar require native-language review.
2026-09-13 05:39:09 +03:00
Lauri Ojansivu 6056c89ebd Refresh short translation audit summary 2026-09-13 05:38:37 +03:00
Lauri Ojansivu cddff73d15 Repair Silesian confirmations and migration controls
Replace twelve Polish findings, preserving blank-secret retention, checklist versus item deletion, newest/oldest ordering and paused/failed migration distinctions. Specialized terminology and grammar require native-language review.
2026-09-13 05:38:36 +03:00
Lauri Ojansivu f18a461b0e Refresh short translation audit progress 2026-09-13 05:38:01 +03:00
Lauri Ojansivu 0a783f33ed Repair Silesian card aging and checklist labels
Replace twelve Polish findings, preserving three fade levels, checklist counts, individual-item deletion and opposite auto-width toggles. Specialized terminology and grammar require native-language review.
2026-09-13 05:38:00 +03:00
Lauri Ojansivu 204e3f260c Refresh concise translation audit summary 2026-09-13 05:37:27 +03:00
Lauri Ojansivu 5ee060d2cc Repair Silesian backup and board status labels
Replace twelve findings, preserving monthly day limits, Azure menu labels and the Persian Jalali identity. Specialized terminology and grammar require native-language review.
2026-09-13 05:37:26 +03:00
Lauri Ojansivu 6649f674e4 Refresh short translation audit progress 2026-09-13 05:36:55 +03:00
Lauri Ojansivu 26b8623de6 Repair Silesian workspace and transfer labels
Replace twelve Polish findings, preserving date/card placeholder order, API transfer direction and Azure portal labels. Specialized terminology and grammar require native-language review.
2026-09-13 05:36:54 +03:00
Lauri Ojansivu 63708b3ce8 Refresh concise translation repair progress 2026-09-13 05:36:19 +03:00
Lauri Ojansivu ced13476a0 Repair Silesian activity and reminder translations
Replace twelve Polish findings, preserving placeholders and due versus end date, checklist completion versus reversal, and import direction distinctions. Specialized terminology and grammar require native-language review.
2026-09-13 05:36:19 +03:00
Lauri Ojansivu 30eb62dca5 Refresh short translation audit summary 2026-09-13 05:35:45 +03:00
Lauri Ojansivu e14c7ab98b Repair Silesian account and legal notice labels
Repair six flagged Polish findings and the associated legal notice link text. Review prefix and link together against their template. Preserve seconds and failure-count distinctions. Specialized wording and grammar require native-language review.
2026-09-13 05:35:45 +03:00
Lauri Ojansivu 48cbf662c2 Refresh concise translation audit progress 2026-09-13 05:35:14 +03:00
Lauri Ojansivu 1218c7910b Repair Silesian memory usage and system diagnostics
Replace five Polish findings, retaining allocated versus used memory, RSS and METEOR_REACTIVITY_ORDER identifiers. Shared reactivity-mode wording remains pending review. Specialized terminology and grammar require native-language review.
2026-09-13 05:35:14 +03:00
Lauri Ojansivu 9a6112aad0 Refresh short translation audit progress 2026-09-13 05:34:43 +03:00
Lauri Ojansivu fb1af8cdf7 Repair Silesian heap totals and external memory labels
Replace five Polish diagnostic findings, retaining available, allocated, executable and physical heap distinctions. Shared size-limit and used-size labels remain pending vocabulary review. Specialized wording and grammar require native-language review.
2026-09-13 05:34:43 +03:00
Lauri Ojansivu 4dd6d76934 Refresh short translation audit summary 2026-09-13 05:34:11 +03:00
Lauri Ojansivu 0c353c60cf Repair Silesian compatibility and context diagnostics
Replace three Polish findings, preserving MongoDB naming and distinct native versus detached context counts. Specialized vocabulary and grammar require native-language review.
2026-09-13 05:34:11 +03:00
Lauri Ojansivu bebfe9356d Refresh concise translation audit progress 2026-09-13 05:33:36 +03:00
Lauri Ojansivu 7aeb74cf09 Repair Silesian allocated memory labels
Repair two Polish memory diagnostics and retain the shared technical DDP transport label. Preserve malloc and distinguish current allocation from peak allocation. Specialized wording and grammar require native-language review.
2026-09-13 05:33:36 +03:00
Lauri Ojansivu fc9f90787a Refresh concise translation audit progress 2026-09-13 05:32:58 +03:00
Lauri Ojansivu 1601125602 Repair Silesian calendar selector language
Replace the Azerbaijani calendar setting and align its calendar label with attested Silesian Kalyndŏrz. Calendar setting grammar remains subject to native-language review.
2026-09-13 05:32:57 +03:00
Lauri Ojansivu d55657db73 Refresh concise translation audit progress 2026-09-13 05:32:14 +03:00
Lauri Ojansivu 790d828a60 Repair Breton advanced filter and Hijri labels
Replace ten wrong-language findings, preserving filter operators, escape sequences, examples and distinct Hijri calendar variants. Specialized epoch terminology and grammar require native-language review.
2026-09-13 05:32:14 +03:00
Lauri Ojansivu 409f4ac90d Refresh concise translation audit summary 2026-09-13 05:31:22 +03:00
Lauri Ojansivu 98b6f329a2 Repair Breton visibility and deletion warnings
Replace twelve French findings, retaining private-only visibility, label toggle versus multi-selection addition and permanent swimlane/vote deletion meanings. Specialized terminology and grammar require native-language review.
2026-09-13 05:31:21 +03:00
Lauri Ojansivu 66ba32629a Refresh concise translation audit progress 2026-09-13 05:30:49 +03:00
Lauri Ojansivu b317b54f0c Repair Breton migration steps and subtext labels
Replace twelve French findings, preserving Lost Cards, URL and ID terminology and shared versus per-swimlane lists. Specialized terminology and grammar require native-language review.
2026-09-13 05:30:49 +03:00
Lauri Ojansivu e47a4c00a8 Refresh short translation audit progress 2026-09-13 05:30:18 +03:00
Lauri Ojansivu 29989b5b65 Repair Breton field display and SMTP descriptions
Replace twelve French findings, preserving ISO 8601, SMTP and TLS identifiers and starred-board ordering. Specialized terminology and grammar require native-language review.
2026-09-13 05:30:18 +03:00
Lauri Ojansivu 24c1687fbc Refresh short translation audit summary 2026-09-13 05:29:46 +03:00
Lauri Ojansivu d3cf4239a2 Repair Breton sidebar and minicard display labels
Replace twelve French findings, preserving show/hide toggle meanings and the strict greater-than card count threshold. Specialized terminology and grammar require native-language review.
2026-09-13 05:29:46 +03:00
Lauri Ojansivu 75d19aa3f5 Refresh short translation audit summary 2026-09-13 05:29:15 +03:00
Lauri Ojansivu ee5220eebe Repair Breton shortcuts and server troubleshooting
Replace twelve French findings, preserving snap and Docker commands, pixel units and WIP maximum wording. Specialized terminology and grammar require native-language review.
2026-09-13 05:29:15 +03:00
Lauri Ojansivu 19b6e5fff1 Refresh concise translation audit progress 2026-09-13 05:28:44 +03:00
Lauri Ojansivu 2a8b8e0f6d Repair Breton recovery and migration confirmations
Replace twelve French findings, preserving swimlaneId/listId and Lost Cards naming. Retain archived versus non-archived scopes and duplicate-empty-list deletion conditions. Specialized terminology and grammar require native-language review.
2026-09-13 05:28:43 +03:00
Lauri Ojansivu a8a677f77d Refresh short translation audit summary 2026-09-13 05:28:07 +03:00
Lauri Ojansivu 7e31ab3223 Repair Breton automation and read permissions
Replace twelve French findings, preserving invitation placeholders, comma-separated checklist instructions and read-only restrictions. Specialized terminology and grammar require native-language review.
2026-09-13 05:28:06 +03:00
Lauri Ojansivu 3e755ce886 Refresh short translation repair summary 2026-09-13 05:27:36 +03:00
Lauri Ojansivu 51d62b18c5 Repair Breton validation and preview messages
Replace twelve French findings, preserving placeholders and login HTML. Retain permanent Planning Poker deletion and PDF download fallback meanings. Specialized terminology and grammar require native-language review.
2026-09-13 05:27:35 +03:00
Lauri Ojansivu a736c8a2f2 Refresh short translation audit progress 2026-09-13 05:27:05 +03:00
Lauri Ojansivu 8e0c7f90c8 Repair Breton notifications and operator errors
Replace twelve French findings, preserving operator placeholders, OIDC naming and positive integer requirements. Specialized terminology and grammar require native-language review.
2026-09-13 05:27:04 +03:00
Lauri Ojansivu c89a259212 Refresh short translation repair summary 2026-09-13 05:26:33 +03:00
Lauri Ojansivu 20fcc9cd57 Repair Breton migration status and selection labels
Replace twelve French findings, preserving migration start/pause/completion distinctions and comment visibility wording. Specialized terminology and grammar require native-language review.
2026-09-13 05:26:33 +03:00
Lauri Ojansivu d82eb5dfe9 Refresh concise translation audit progress 2026-09-13 05:26:03 +03:00
Lauri Ojansivu e4f942b13d Repair Breton list actions and upload limits
Replace twelve French findings, preserving Trello and Excel identifiers, byte units and permanent list deletion warning. Specialized terminology and grammar require native-language review.
2026-09-13 05:26:03 +03:00
Lauri Ojansivu 3f4057f908 Refresh short translation audit progress 2026-09-13 05:25:33 +03:00
Lauri Ojansivu 9e4f2d2ae7 Repair Breton member mapping and label warnings
Replace twelve French findings. Preserve placeholders, shortcut toggle states, permanent label deletion and the requirement for at least one administrator. Specialized terminology and grammar require native-language review.
2026-09-13 05:25:32 +03:00
Lauri Ojansivu 1cc63a573f Refresh concise translation audit summary 2026-09-13 05:25:00 +03:00
Lauri Ojansivu beb2e1ecae Repair Breton display and import instructions
Replace twelve French findings, preserving the ended predicate and CSV, TSV and JSON identifiers. Retain label text versus list display distinctions. Specialized terminology and grammar require native-language review.
2026-09-13 05:24:59 +03:00
Lauri Ojansivu 12c2941ce2 Refresh concise translation progress summary 2026-09-13 05:24:29 +03:00
Lauri Ojansivu f02fb1c2a5 Repair Breton search operator descriptions
Replace twelve French findings, preserving operators, predicates, argument names and descending sort syntax. Close the unmatched overdue example markdown delimiter. Specialized terminology and grammar require native-language review.
2026-09-13 05:24:28 +03:00
Lauri Ojansivu cf77c420b2 Refresh concise translation repair progress 2026-09-13 05:23:53 +03:00
Lauri Ojansivu a850f595aa Repair Breton search instructions and date filters
Replace sixteen French findings, preserving search tokens and English example arguments. Clarify OR versus AND combination and double-quoted values. Specialized terminology and grammar require native-language review.
2026-09-13 05:23:52 +03:00
Lauri Ojansivu 63abc07301 Refresh short translation progress summary 2026-09-13 05:23:14 +03:00
Lauri Ojansivu 1d6bece380 Repair Breton export fields and filter messages
Replace sixteen French findings, retaining Excel naming and distinct creator, owner, member and assignee roles. Preserve insufficient disk space and self-invitation errors. Specialized terminology and grammar require native-language review.
2026-09-13 05:23:13 +03:00
Lauri Ojansivu f233e2aa1f Refresh concise translation audit progress 2026-09-13 05:22:41 +03:00
Lauri Ojansivu b9ce02e415 Repair Breton account email and validation errors
Replace sixteen French findings, preserving email placeholders, CSV/TSV identifiers and zoom limits. Specialized terminology and grammar require native-language review.
2026-09-13 05:22:41 +03:00
Lauri Ojansivu d9326a95ba Refresh short translation audit summary 2026-09-13 05:22:07 +03:00
Lauri Ojansivu f1c4180e80 Repair Breton date editor and enrollment messages
Replace sixteen French findings, preserving email and due-time placeholders and distinct received, start, due and vote end dates. Specialized terminology and grammar require native-language review.
2026-09-13 05:22:07 +03:00
Lauri Ojansivu 71a30f6b4f Refresh concise translation repair progress 2026-09-13 05:21:36 +03:00
Lauri Ojansivu c852e82297 Repair Breton branding and duplicate list warnings
Replace sixteen French findings. Preserve the default logo height, URL and HTML terms, and the empty-list AND matching populated-list deletion condition. Specialized terminology and grammar require native-language review.
2026-09-13 05:21:35 +03:00
Lauri Ojansivu 2ab326e634 Refresh short translation repair summary 2026-09-13 05:20:58 +03:00
Lauri Ojansivu e6b0bd60b7 Repair Breton migration and custom content labels
Replace sixteen French findings, preserving assetlinks.json, HTML entities and template placeholders. Retain permanent custom-field deletion and history loss warnings. Specialized terminology and grammar require native-language review.
2026-09-13 05:20:58 +03:00
Lauri Ojansivu 2328359a08 Refresh short translation audit progress 2026-09-13 05:20:25 +03:00
Lauri Ojansivu 3ef0aa29e0 Repair Breton template and scheduled job translations
Replace sixteen French findings, preserving JSON property names and newest/oldest sorting distinctions. Specialized terminology and grammatical wording require native-language review.
2026-09-13 05:20:24 +03:00
Lauri Ojansivu ab40bb2472 Refresh concise translation audit summary 2026-09-13 05:19:50 +03:00
Lauri Ojansivu c0a322d2a3 Repair Breton card display and commenting labels
Replace sixteen French findings. Review the assigned-comment role against its source capabilities and checklist close controls against their templates. Preserve the missing-comment placeholder. Specialized terminology and grammar need native-language review.
2026-09-13 05:19:50 +03:00
Lauri Ojansivu b1cea3fab0 Update short translation audit progress 2026-09-13 05:19:07 +03:00
Lauri Ojansivu 64edd57d14 Repair Breton authentication and card action translations
Replace sixteen French findings, retaining URL terminology and source placeholders. Preserve permanent deletion and archive restoration distinctions. Specialized terminology and grammatical wording require native-language review.
2026-09-13 05:19:06 +03:00
Lauri Ojansivu 87a0fe501d Refresh concise translation repair progress 2026-09-13 05:18:27 +03:00
Lauri Ojansivu f7973731a0 Repair Breton workspace and upload labels
Replace eight French findings with Breton wording, preserving the due-time placeholder. Specialized terminology and grammatical wording remain subject to native-language review.
2026-09-13 05:18:26 +03:00
Lauri Ojansivu 973b190ba3 Refresh short audit after Breton workspace editing repairs 2026-09-13 05:15:36 +03:00
Lauri Ojansivu 9c0f75509b Repair Breton workspace editing and organization labels
Preserve workspace/subworkspace distinction, deletion confirmation and markdown icon field. Specialized terminology and grammar need language review.
2026-09-13 05:15:35 +03:00
Lauri Ojansivu da2138b55c Refresh short audit after Breton date activity repairs 2026-09-13 05:15:04 +03:00
Lauri Ojansivu 511bbe8de5 Repair Breton date activities and custom field clearing
Preserve date-first/card-second arguments and distinguish clearing a field value from deleting its definition. Specialized terminology and grammar need language review.
2026-09-13 05:15:04 +03:00
Lauri Ojansivu 376fd6f201 Refresh short audit after Breton checklist status repairs 2026-09-13 05:14:25 +03:00
Lauri Ojansivu 8b9fd148c6 Repair Breton overdue and checklist status activity messages
Remove spurious digit before list title placeholder and preserve complete/incomplete actions. Specialized terminology and grammar need language review.
2026-09-13 05:14:24 +03:00
Lauri Ojansivu 63de438b5b Refresh short audit after Breton time change repairs 2026-09-13 05:13:54 +03:00
Lauri Ojansivu d20a7d8f21 Repair Breton time change and due reminder descriptions
Preserve old/new timestamps, first reminder and approaching versus current deadline. Specialized terminology and grammar need language review.
2026-09-13 05:13:53 +03:00
Lauri Ojansivu daa1b49064 Refresh short audit after Breton accessibility repairs 2026-09-13 05:13:22 +03:00
Lauri Ojansivu d5c9a4d9b6 Repair Breton account creation and accessibility messages
Translate the legal notice prefix together with its rendered label. Preserve failure-window seconds and account change options. Specialized terminology and grammar need language review.
2026-09-13 05:13:21 +03:00
Lauri Ojansivu ef202bec87 Refresh short audit after Breton process diagnostic repairs 2026-09-13 05:12:46 +03:00
Lauri Ojansivu cc7a5e1f46 Repair Breton process memory and placement descriptions
Preserve RSS, actual memory use, OS uptime and above-selected placement. Specialized terminology and grammar need language review.
2026-09-13 05:12:45 +03:00
Lauri Ojansivu 9583a44d8c Refresh short audit after Breton heap metric repairs 2026-09-13 05:12:16 +03:00
Lauri Ojansivu 8888e57b65 Repair Breton heap memory metric descriptions
Preserve peak malloc, available, executable, physical and used heap distinctions. Specialized terminology has low confidence and needs language review.
2026-09-13 05:12:15 +03:00
Lauri Ojansivu eed8520d6d Refresh short audit after Breton memory diagnostic repairs 2026-09-13 05:11:44 +03:00
Lauri Ojansivu e421a52597 Repair Breton Node memory diagnostics and wait spinner labels
Describe heap garbage overwriting rather than an option named does_zap_garbage. Preserve malloc and MongoDB identifiers. Specialized terminology has low confidence and needs language review.
2026-09-13 05:11:44 +03:00
Lauri Ojansivu 7e4f662988 Refresh short audit after Breton validation repairs 2026-09-13 05:11:12 +03:00
Lauri Ojansivu ef2091980a Repair Breton username validation and worker permissions
Preserve three-character minimum, username token and restricted worker capabilities. Specialized terminology and grammar need language review.
2026-09-13 05:11:11 +03:00
Lauri Ojansivu 7eb23eea02 Refresh short audit after Breton export restriction repairs 2026-09-13 05:10:41 +03:00
Lauri Ojansivu fa2aae7151 Repair Breton export restrictions and assignee toggle description
Preserve card-specific export limits and board addition order for assignee shortcuts. Specialized terminology and grammar need language review.
2026-09-13 05:10:40 +03:00
Lauri Ojansivu 57dc9b34ab Refresh short audit after Breton swimlane archive repairs 2026-09-13 05:10:10 +03:00
Lauri Ojansivu e7e5ea680e Repair Breton swimlane archive and support visibility descriptions
Preserve logged-in support restriction, scan subjects and swimlane restoration. Specialized terminology and grammar need language review.
2026-09-13 05:10:10 +03:00
Lauri Ojansivu 429361c428 Refresh short audit after Breton shortcut repairs 2026-09-13 05:09:39 +03:00
Lauri Ojansivu f38f874c33 Repair Breton shortcuts and board display labels
Preserve current-card self-assignment, sidebar toggling and starred-board ordering. Specialized terminology and grammar need language review.
2026-09-13 05:09:39 +03:00
Lauri Ojansivu 72a11eb2ee Refresh short audit after Breton migration confirmation repairs 2026-09-13 05:09:06 +03:00
Lauri Ojansivu b5fd95d617 Repair Breton migration confirmations and board search scope
Preserve board/member-specific storage repairs, data-integrity checks and search field scope. Specialized terminology and grammar need language review.
2026-09-13 05:09:06 +03:00
Lauri Ojansivu 3949c26078 Refresh short audit after Breton removal confirmation repairs 2026-09-13 05:08:33 +03:00
Lauri Ojansivu 078dc1e44e Repair Breton rule fragments and member removal confirmations
Preserve rule clause fragments, board-only removal and member notifications. Specialized terminology and grammar need language review.
2026-09-13 05:08:32 +03:00
Lauri Ojansivu d8dad6fa1a Refresh short audit after Breton rule movement repairs 2026-09-13 05:08:00 +03:00
Lauri Ojansivu 9cf1dcf708 Repair Breton rule movement and invitation messages
Preserve top/bottom and own-list distinctions and invitation placeholders. Specialized terminology and grammar need language review.
2026-09-13 05:07:59 +03:00
Lauri Ojansivu f4a36e9e1f Refresh short audit after Breton visibility permission repairs 2026-09-13 05:07:26 +03:00
Lauri Ojansivu 695aca1e6a Repair Breton visibility permissions and checklist line handling
Preserve assigned-card visibility, public edit restrictions and original checklist order. Specialized terminology and grammar need language review.
2026-09-13 05:07:25 +03:00
Lauri Ojansivu 703dbbc765 Refresh short audit after Breton bulk attachment repairs 2026-09-13 05:06:52 +03:00
Lauri Ojansivu 36c06cedb4 Repair Breton migration status and bulk attachment movement labels
Preserve administrator-only execution, per-migration execution and board/global attachment scope. Specialized terminology and grammar need language review.
2026-09-13 05:06:52 +03:00
Lauri Ojansivu e5d5c46d80 Refresh short audit after Breton list archive repairs 2026-09-13 05:06:19 +03:00
Lauri Ojansivu 22119fb8ed Repair Breton board leaving and list archive messages
Preserve leaving-board membership removal and archive restoration instructions. Specialized terminology and grammar need language review.
2026-09-13 05:06:19 +03:00
Lauri Ojansivu d0c129fcbc Refresh short audit after Breton import repairs 2026-09-13 05:05:47 +03:00
Lauri Ojansivu 4caa469ce0 Repair Breton board import and checklist visibility instructions
Preserve member mapping fallback and ZIP attachment structure. Specialized terminology and grammar need language review.
2026-09-13 05:05:47 +03:00
Lauri Ojansivu f53d120db2 Refresh short audit after Breton search operator repairs 2026-09-13 05:05:15 +03:00
Lauri Ojansivu 2f5897ee8c Repair Breton global search role and board operators
Preserve operator tokens, argument names and member/assignee/creator distinctions. Specialized terminology and grammar need language review.
2026-09-13 05:05:14 +03:00
Lauri Ojansivu 0011d46816 Refresh short audit after Breton account error repairs 2026-09-13 05:04:43 +03:00
Lauri Ojansivu 305ef1fc8b Repair Breton account errors and storage repair descriptions
Preserve administrator requirements, distinct account errors and board-scoped storage repairs. Specialized terminology and grammar need language review.
2026-09-13 05:04:42 +03:00
Lauri Ojansivu f11a0198bf Refresh short audit after Breton invitation repairs 2026-09-13 05:04:10 +03:00
Lauri Ojansivu 5168ee2cea Repair Breton invitation emails and due card view description
Keep invitation tokens intact and describe all incomplete cards with due dates, without implying they are already overdue. Specialized terminology and grammar need language review.
2026-09-13 05:04:09 +03:00
Lauri Ojansivu 9a82d829d8 Refresh short audit after Breton deletion constraint repairs 2026-09-13 05:03:37 +03:00
Lauri Ojansivu b5e21327a5 Repair Breton deletion constraints and confirmation messages
Preserve linked-card prerequisites, existing-user constraints and irreversible deletion. Specialized terminology and grammatical wording need language review.
2026-09-13 05:03:37 +03:00
Lauri Ojansivu 228ef30ee0 Refresh short audit after Breton deletion warning repairs 2026-09-13 05:03:02 +03:00
Lauri Ojansivu b80b1a811d Repair Breton deletion warnings and custom field instructions
Preserve irreversible deletion and image/link URL distinctions. Specialized terminology and grammatical wording need language review.
2026-09-13 05:03:01 +03:00
Lauri Ojansivu df2449bb96 Record Breton terminology follow-up in short audit 2026-09-13 05:02:30 +03:00
Lauri Ojansivu c4f4d86e7b Clarify Breton star actions and data migration wording 2026-09-13 05:02:24 +03:00
Lauri Ojansivu 309d1c87ef Refresh short audit after Breton checklist confirmation repairs 2026-09-13 05:02:14 +03:00
Lauri Ojansivu f25115fa0d Repair Breton checklist confirmations and board migration descriptions
Preserve checklist/item distinctions and migration integrity checks. Specialized terminology and grammatical wording need language review.
2026-09-13 05:02:13 +03:00
Lauri Ojansivu 510882f75c Refresh short audit after Breton membership scope repairs 2026-09-13 05:01:43 +03:00
Lauri Ojansivu 3f0957df4c Repair Breton board settings and member scopes
Preserve board-wide versus current-card membership and assignee scopes. Specialized terminology and grammatical wording need language review.
2026-09-13 05:01:42 +03:00
Lauri Ojansivu d8203bf1e0 Refresh short audit after Breton storage repairs 2026-09-13 05:01:12 +03:00
Lauri Ojansivu a75d7b72af Repair Breton attachment storage and board behavior labels
Preserve GridFS/S3 targets, new-card scope and irreversible board deletion. Specialized terminology and grammatical wording need language review.
2026-09-13 05:01:11 +03:00
Lauri Ojansivu f597b2cbbd Refresh short audit after Breton workspace repairs 2026-09-13 05:00:41 +03:00
Lauri Ojansivu ffbb7987fd Repair Breton workspace and offline warning messages
Preserve offline data-loss warning, logged-in access and permanent attachment deletion. Specialized terminology and grammatical wording need language review.
2026-09-13 05:00:40 +03:00
Lauri Ojansivu 5e59e6a402 Refresh short audit after Breton administrator repairs 2026-09-13 05:00:10 +03:00
Lauri Ojansivu 5abfc74ffd Repair Breton creation settings and administrator permission text
Preserve HTML body placement and administrator capabilities. Specialized terminology and grammatical wording need language review.
2026-09-13 05:00:10 +03:00
Lauri Ojansivu 664096a4a4 Refresh short audit after Breton card placement repairs 2026-09-13 04:59:38 +03:00
Lauri Ojansivu 420f8bc697 Repair Breton card placement and image action labels
Preserve movement argument order and top/bottom placement. Kanban terminology and grammatical wording need language review.
2026-09-13 04:59:37 +03:00
Lauri Ojansivu cef6b1822b Refresh short audit after Breton checklist activity repairs 2026-09-13 04:59:08 +03:00
Lauri Ojansivu 9cc55e322f Repair Breton checklist and label activity descriptions
Distinguish checklist-item removal from removal of a whole checklist. Preserve tokens and incomplete-state actions; grammatical wording needs language review.
2026-09-13 04:59:07 +03:00
Lauri Ojansivu 07e02674da Refresh short audit after Breton movement activity repairs 2026-09-13 04:58:37 +03:00
Lauri Ojansivu 262c774843 Repair Breton movement and membership activity messages
Preserve old/new list, swimlane and board destinations and member/removal tokens. Kanban terminology and grammatical mutations need language review.
2026-09-13 04:58:37 +03:00
Lauri Ojansivu cfd73b9079 Refresh short audit after Breton creation activity repairs 2026-09-13 04:58:03 +03:00
Lauri Ojansivu bcf45b1691 Repair Breton creation and deletion activity messages
Preserve completion, import and comment-edit meanings and activity tokens. Kanban terminology and grammatical mutations need language review.
2026-09-13 04:58:03 +03:00
Lauri Ojansivu f79011de44 Refresh short audit after Breton archive activity repairs 2026-09-13 04:57:33 +03:00
Lauri Ojansivu b507391522 Repair Breton comment, label and archive activity messages
Preserve activity locations and substitution tokens. Kanban terminology and grammatical mutations need language review.
2026-09-13 04:57:32 +03:00
Lauri Ojansivu ea57dcb795 Refresh short audit after Breton activity repairs 2026-09-13 04:57:01 +03:00
Lauri Ojansivu 93440fd7fc Repair Breton lockout settings and attachment activity messages
Preserve activity tokens and old/new due values. Security and kanban terminology has low confidence and needs language review.
2026-09-13 04:57:00 +03:00
Lauri Ojansivu 6f136fc4fa Refresh short audit after Breton account repairs 2026-09-13 04:56:27 +03:00
Lauri Ojansivu 427f805282 Repair Breton account lockout messages
Replace French wording while preserving temporary lockout and known-user distinctions. Security terminology has low confidence and needs language review.
2026-09-13 04:56:27 +03:00
Lauri Ojansivu 4a3f9cfd5e Refresh short audit after Guarani calendar repairs 2026-09-13 04:55:53 +03:00
Lauri Ojansivu 31aa021a89 Repair Guarani calendar system and calendar names
Use dictionary-backed arapapaha and preserve proper names. Specialized labels have low confidence and need language review; three epoch/observation findings remain pending.
2026-09-13 04:55:53 +03:00
Lauri Ojansivu ce2161dae4 Refresh short audit after Aymara calendar repairs 2026-09-13 04:55:20 +03:00
Lauri Ojansivu f08806ce0c Repair Aymara calendar names using dictionary terminology
Use pachachimpu for calendar and retain borrowed proper names. Specialized labels have low confidence and need language review; system and epoch qualifiers remain pending.
2026-09-13 04:55:19 +03:00
Lauri Ojansivu aed40b811a Refresh short audit after isiXhosa calendar repairs 2026-09-13 04:54:44 +03:00
Lauri Ojansivu 112424bdac Repair isiXhosa calendar names
Replace twelve English calendar labels while preserving proper names. Specialized names have low confidence and need language review; epoch and observation qualifiers remain pending.
2026-09-13 04:54:43 +03:00
Lauri Ojansivu 503ee29a40 Refresh short audit after Kinyarwanda calendar repairs 2026-09-13 04:54:12 +03:00
Lauri Ojansivu 9f543f14ea Repair Kinyarwanda calendar labels
Preserve calendar variant names and observation/epoch distinctions. Specialized terminology has low confidence and requires language review.
2026-09-13 04:54:11 +03:00
Lauri Ojansivu 2ec4d8f6a3 Refresh short audit after Akan calendar repairs 2026-09-13 04:53:37 +03:00
Lauri Ojansivu 91fffed672 Repair Akan Indian calendar label and missing parenthesis
Preserve the existing civil-calendar translation while closing its variant qualifier. Indian national calendar terminology has low confidence and needs language review; two specialized audit findings remain.
2026-09-13 04:53:36 +03:00
Lauri Ojansivu 3ba1692f1c Refresh short audit after Papiamento calendar repairs 2026-09-13 04:53:03 +03:00
Lauri Ojansivu bad71937bf Repair Papiamento calendar labels
Replace foreign calendar labels while preserving variant names and epoch distinctions. Specialized terminology has low confidence and needs language review.
2026-09-13 04:53:03 +03:00
Lauri Ojansivu 28b2d5b8a2 Refresh short audit after Occitan flagged queue completion 2026-09-13 04:52:24 +03:00
Lauri Ojansivu ada6f51878 Repair Occitan advanced filter instructions and escape examples 2026-09-13 04:52:12 +03:00
Lauri Ojansivu 2a27fea98d Refresh short audit after Occitan calendar repairs 2026-09-13 04:51:48 +03:00
Lauri Ojansivu 7c7a8f3871 Repair Occitan calendar names and permanent deletion warning 2026-09-13 04:51:47 +03:00
Lauri Ojansivu 25cc2f1697 Refresh short audit after Occitan tracking repairs 2026-09-13 04:51:16 +03:00
Lauri Ojansivu 45f40b5f72 Repair Occitan migration steps and tracking descriptions 2026-09-13 04:51:16 +03:00
Lauri Ojansivu f77fb6cfac Refresh short audit after Occitan display repairs 2026-09-13 04:50:44 +03:00
Lauri Ojansivu 2f2d20f751 Repair Occitan display and SMTP descriptions 2026-09-13 04:50:44 +03:00
Lauri Ojansivu 878497e882 Refresh short audit after Occitan confirmation repairs 2026-09-13 04:50:14 +03:00
Lauri Ojansivu d946535f70 Repair Occitan migration confirmations and shortcut labels 2026-09-13 04:50:13 +03:00
Lauri Ojansivu 609201219f Refresh short audit after Occitan restore repairs 2026-09-13 04:49:40 +03:00
Lauri Ojansivu 07d5af3884 Repair Occitan restore and read-only permission descriptions 2026-09-13 04:49:40 +03:00
Lauri Ojansivu dc9944d3c0 Refresh short audit after Occitan search error repairs 2026-09-13 04:49:07 +03:00
Lauri Ojansivu 6e8baa3c06 Repair Occitan notification and search error messages 2026-09-13 04:49:06 +03:00
Lauri Ojansivu 8cba9e3de8 Refresh short audit after Occitan migration repairs 2026-09-13 04:48:35 +03:00
Lauri Ojansivu 4e58c9758b Repair Occitan migration and selection labels 2026-09-13 04:48:34 +03:00
Lauri Ojansivu 4630f7c4b9 Refresh short audit after Occitan warning repairs 2026-09-13 04:48:05 +03:00
Lauri Ojansivu b098a1edee Repair Occitan import, invitation and label warnings 2026-09-13 04:47:55 +03:00
Lauri Ojansivu 49407fb08a Refresh short audit after Occitan search repairs 2026-09-13 04:47:31 +03:00
Lauri Ojansivu debbc467ab Repair Occitan global search instructions and migration labels 2026-09-13 04:47:30 +03:00
Lauri Ojansivu 449d248075 Refresh short audit after Occitan filter repairs 2026-09-13 04:46:45 +03:00
Lauri Ojansivu 53e43646cc Repair Occitan export people and date filter labels 2026-09-13 04:46:36 +03:00
Lauri Ojansivu 89db74ae3f Refresh short audit after Occitan Excel repairs 2026-09-13 04:44:00 +03:00
Lauri Ojansivu 19c73d640c Repair Occitan Excel export and input error messages
Replace ten French findings. Preserve zoom limits, CSV and TSV distinctions, disk space failure and exported date categories. Regional terminology requires language review.
2026-09-13 04:43:51 +03:00
Lauri Ojansivu 01489ddb64 Refresh short audit after Occitan due date repairs 2026-09-13 04:43:25 +03:00
Lauri Ojansivu 8317e8a7bb Repair Occitan due date and display controls
Replace twelve French findings. Preserve duplicate-list deletion conditions, subtask landing list and due-date scope and token. Regional terminology requires language review.
2026-09-13 04:43:15 +03:00
Lauri Ojansivu 44ec167bab Refresh short audit after Occitan header repairs 2026-09-13 04:42:48 +03:00
Lauri Ojansivu 2d58855c92 Repair Occitan custom header and database settings
Replace twelve French findings. Preserve head and meta identifiers, default logo height and both conditions required for empty duplicate-list removal. Regional terminology requires language review.
2026-09-13 04:42:38 +03:00
Lauri Ojansivu aad070f882 Refresh short audit after Occitan custom markup repairs 2026-09-13 04:42:12 +03:00
Lauri Ojansivu da3b0fbf6f Repair Occitan migration retry and custom field settings
Replace twelve French findings. Preserve paused versus failed migration states, irreversible field-history warning, format placeholder and HTML entities. Regional terminology requires language review.
2026-09-13 04:42:03 +03:00
Lauri Ojansivu e17826c39e Refresh short audit after Occitan job status repairs 2026-09-13 04:41:35 +03:00
Lauri Ojansivu 6a47bfe780 Repair Occitan scheduled job and card ordering labels
Replace twelve French findings. Preserve newest and oldest sort directions, job failure and success states and cover image meaning. Regional terminology requires language review.
2026-09-13 04:41:26 +03:00
Lauri Ojansivu 6d532da336 Refresh short audit after Occitan comment repairs 2026-09-13 04:41:00 +03:00
Lauri Ojansivu 49b48e1e6e Repair Occitan minicard and comment controls
Replace ten French findings. Preserve automatic width state, assigned-card comment permissions and search placeholder. Regional terminology requires language review.
2026-09-13 04:40:51 +03:00
Lauri Ojansivu cef2effda1 Refresh short audit after Occitan card display repairs 2026-09-13 04:40:26 +03:00
Lauri Ojansivu a69d622fe9 Repair Occitan card archive and display labels
Replace ten foreign-language findings. Preserve avatar limit placeholder, relative insertion positions, attachment count and archive restoration behavior. Regional terminology requires language review.
2026-09-13 04:40:16 +03:00
Lauri Ojansivu 33fc1f4fde Refresh short audit after Occitan authentication repairs 2026-09-13 04:39:52 +03:00
Lauri Ojansivu e2c0b92a21 Repair Occitan attachment and authentication labels
Replace ten French findings. Preserve due-time placeholder, allowed file type distinctions and one URL scheme per line instructions. Regional terminology requires language review.
2026-09-13 04:39:40 +03:00
Lauri Ojansivu 7776036e92 Refresh short audit after Occitan custom field repairs 2026-09-13 04:39:15 +03:00
Lauri Ojansivu aa25093e8f Repair Occitan custom field and workspace labels
Replace ten French findings. Preserve activity arguments and distinguish clearing a field value from deleting a field. Regional terminology requires language review.
2026-09-13 04:39:04 +03:00
Lauri Ojansivu ee2f9a5518 Refresh short audit after Occitan date activity repairs 2026-09-13 04:38:38 +03:00
Lauri Ojansivu 01317b9c3f Repair Occitan date activity notifications
Replace ten French findings. Preserve time and notification placeholders, correct date and card argument meanings and remove the stray numeral before renamed-list text. Regional terminology requires language review.
2026-09-13 04:38:26 +03:00
Lauri Ojansivu 632748f410 Refresh short audit after Occitan accessibility repairs 2026-09-13 04:38:00 +03:00
Lauri Ojansivu 4ba4466424 Repair Occitan accessibility and account setting messages
Replace twelve French findings. Preserve lockout units and thresholds, account creation behavior and old and new ending-time placeholders. Regional terminology requires language review.
2026-09-13 04:37:50 +03:00
Lauri Ojansivu ddf3354e46 Refresh short audit after Occitan memory repairs 2026-09-13 04:37:25 +03:00
Lauri Ojansivu 85f762bfde Repair Occitan memory and uptime diagnostic labels
Replace twelve French findings. Preserve memory statistic distinctions and loading indicator identifiers. Describe heap zapping as bit-pattern overwrite rather than an option named does_zap_garbage. Specialized terminology requires language review.
2026-09-13 04:37:16 +03:00
Lauri Ojansivu a9c8509397 Refresh short audit after Occitan diagnostic repairs 2026-09-13 04:36:49 +03:00
Lauri Ojansivu 5bdac26e5c Repair Occitan WIP and diagnostic labels
Replace sixteen French findings. Correct swimlane selection scope and preserve worker permissions, WIP guidance and diagnostic identifiers. Specialized terminology requires language review; heap zap wording remains pending.
2026-09-13 04:36:40 +03:00
Lauri Ojansivu 59992d41dc Refresh short audit after Occitan account permission repairs 2026-09-13 04:36:13 +03:00
Lauri Ojansivu 1fed8f2b14 Repair Occitan account and export permission messages
Replace ten French findings. Preserve username placeholder, minimum length, assignee ordering and export permission scopes. Regional terminology requires language review.
2026-09-13 04:36:03 +03:00
Lauri Ojansivu e94c668493 Refresh short audit after Occitan maintenance repairs 2026-09-13 04:35:38 +03:00
Lauri Ojansivu b71708fbbc Repair Occitan swimlane and maintenance labels
Replace twelve French findings. Preserve swimlane archive recovery, logged-in support restriction and board member avatar scope. Regional terminology requires language review.
2026-09-13 04:35:29 +03:00
Lauri Ojansivu 01f950d15b Refresh short audit after Occitan display repairs 2026-09-13 04:35:02 +03:00
Lauri Ojansivu 22bc0125b6 Repair Occitan search and display settings
Replace ten French findings. Preserve board search scope, missing-list repair confirmation, sidebar toggle and starred-board ordering. Regional terminology requires language review.
2026-09-13 04:34:53 +03:00
Lauri Ojansivu cf35a88c9b Refresh short audit after Occitan removal repairs 2026-09-13 04:34:27 +03:00
Lauri Ojansivu 54807f54b1 Repair Occitan removal and migration confirmations
Replace fifteen French findings. Preserve membership removal scope, notification behavior, rule fragments and migration confirmation meanings. Regional terminology requires language review.
2026-09-13 04:34:18 +03:00
Lauri Ojansivu c8a1b95907 Refresh short audit after Occitan permission repairs 2026-09-13 04:33:51 +03:00
Lauri Ojansivu 75c797fd75 Repair Occitan permission and checklist instructions
Replace fourteen French findings. Preserve public board visibility, editing permissions, original checklist order and rule movement targets. Regional terminology requires language review.
2026-09-13 04:33:42 +03:00
Lauri Ojansivu 2d4bc2f579 Refresh short audit after Occitan migration repairs 2026-09-13 04:33:16 +03:00
Lauri Ojansivu b7c4ebf621 Repair Occitan migration and attachment action labels
Replace twelve French findings. Preserve administrator-only migration permissions, archive restoration guidance and board-scoped versus global attachment actions. Regional terminology requires language review.
2026-09-13 04:33:06 +03:00
Lauri Ojansivu 5c74db05df Refresh short audit after Occitan archive repairs 2026-09-13 04:32:39 +03:00
Lauri Ojansivu e70c6fa486 Repair Occitan import and archive instructions
Replace twelve French findings. Preserve public-search token, board title placeholder, member fallback behavior and archive recovery instructions. Regional terminology requires language review.
2026-09-13 04:32:30 +03:00
Lauri Ojansivu ea4ce27b61 Refresh short audit after Occitan search repairs 2026-09-13 04:32:02 +03:00
Lauri Ojansivu 1c8e57c361 Repair Occitan search and invitation translations
Replace eighteen French findings. Restore source search argument identifiers and distinguish cards with due dates from overdue cards. Preserve invitation tokens and repair behavior. Regional terminology requires language review.
2026-09-13 04:31:53 +03:00
Lauri Ojansivu dbee8fc52e Refresh short audit after Occitan deletion repairs 2026-09-13 04:31:22 +03:00
Lauri Ojansivu 6fc79d09ce Repair Occitan deletion warnings
Replace fifteen French findings. Preserve irreversible deletion warnings, linked-card prerequisites and organization and team membership constraints. Regional terminology requires language review.
2026-09-13 04:31:13 +03:00
Lauri Ojansivu f2c5fc9d0c Refresh short audit after Occitan checklist repairs 2026-09-13 04:30:45 +03:00
Lauri Ojansivu 265c05c42a Repair Occitan checklist and migration messages
Replace fifteen French findings. Clarify checklist form closure, retain deletion confirmation scope and describe board integrity checks. Regional terminology requires language review.
2026-09-13 04:30:36 +03:00
Lauri Ojansivu fd3389aa50 Refresh short audit after Occitan board repairs 2026-09-13 04:30:09 +03:00
Lauri Ojansivu 3f16693c0a Repair Occitan board settings and member scope labels
Replace sixteen French and Azeri findings. Preserve permanent deletion warning, assignment scopes and attachment storage identifiers. Regional terminology requires language review.
2026-09-13 04:30:00 +03:00
Lauri Ojansivu 40d78798a4 Refresh short audit after Occitan workspace repairs 2026-09-13 04:29:30 +03:00
Lauri Ojansivu 51ef23c32d Repair Occitan administrator and workspace labels
Replace twenty French findings with Occitan control labels. Preserve top versus bottom actions, administrator permissions and custom HTML boundaries. Regional terminology requires language review.
2026-09-13 04:29:21 +03:00
Lauri Ojansivu 774d9fc610 Refresh short audit after Occitan activity repairs 2026-09-13 04:28:55 +03:00
Lauri Ojansivu afcd37d9c4 Repair Occitan activity translations
Replace eighteen French findings with Occitan activity and add-control messages. Preserve notification placeholders, move origins and destinations and checklist arguments. Regional terminology remains subject to language review.
2026-09-13 04:28:45 +03:00
Lauri Ojansivu 4adc10ea25 Refresh short audit after Occitan account repairs 2026-09-13 04:28:16 +03:00
Lauri Ojansivu 5d9008e84d Repair Occitan account lockout translations
Replace sixteen French findings with Occitan account protection and unlock messages. Preserve known versus unknown user distinctions and confirmation scope. Regional terminology remains subject to language review.
2026-09-13 04:28:07 +03:00
Lauri Ojansivu f76789a023 Refresh short audit after Bislama repairs 2026-09-13 04:27:40 +03:00
Lauri Ojansivu 062d9ab9ff Repair Bislama calendar translations
Replace seventeen foreign-language calendar findings. Preserve proper names and civil, astronomical and lunar sighting distinctions. Low-confidence specialized terminology requires native-speaker review.
2026-09-13 04:27:29 +03:00
Lauri Ojansivu 0d8f94b26a Refresh short audit after Malagasy repairs 2026-09-13 04:27:06 +03:00
Lauri Ojansivu 76b7de376a Repair Malagasy calendar translations
Replace seventeen foreign-language calendar findings. Preserve proper calendar names and civil, astronomical and lunar sighting distinctions. Specialized terminology requires native-speaker review.
2026-09-13 04:26:58 +03:00
Lauri Ojansivu 80e82fe382 Refresh short audit after Kashmiri Hijri name repairs 2026-09-13 04:26:35 +03:00
Lauri Ojansivu 610f17c018 Repair Kashmiri Hijri and Umm al-Qura calendar names
Replace two English calendar labels using the existing Kashmiri calendar spelling. Retain the proper calendar name. Civil, astronomical and sighting descriptions remain pending vocabulary review.
2026-09-13 04:26:26 +03:00
Lauri Ojansivu 5e99eb4052 Refresh short audit after Kashmiri calendar repairs 2026-09-13 04:26:06 +03:00
Lauri Ojansivu d319dfac61 Repair Kashmiri named calendar labels
Replace five foreign-language calendar findings using existing Kashmiri calendar orthography and localized names. Low-confidence wording requires native-speaker review; Hijri variant labels remain pending.
2026-09-13 04:25:57 +03:00
Lauri Ojansivu 1062a2f689 Refresh short audit after Tigrinya repairs 2026-09-13 04:25:31 +03:00
Lauri Ojansivu d290b8bcf7 Repair Tigrinya national and Hijri calendar labels
Replace two retained English findings. Preserve Indian national calendar and Saudi lunar sighting meanings. Low-confidence specialized wording requires native-speaker review.
2026-09-13 04:25:21 +03:00
Lauri Ojansivu 4579449088 Refresh short audit after Bhojpuri repairs 2026-09-13 04:25:01 +03:00
Lauri Ojansivu 1edd9f0b4d Repair Bhojpuri calendar translations
Replace seventeen foreign-language calendar findings. Preserve national calendar, epoch and lunar sighting distinctions. Specialized calendar wording requires native-speaker review.
2026-09-13 04:24:52 +03:00
Lauri Ojansivu 9a97c468b3 Refresh short audit after Maithili and Konkani repairs 2026-09-13 04:24:29 +03:00
Lauri Ojansivu ea00af0967 Repair Maithili and Konkani Hijri calendar labels
Replace four English calendar findings. Preserve Saudi lunar sighting and astronomical tabular epoch meanings. Low-confidence specialized terminology requires native-speaker review.
2026-09-13 04:24:20 +03:00
Lauri Ojansivu f4f7c597d3 Refresh short audit after Moroccan Arabic filter repair 2026-09-13 04:23:56 +03:00
Lauri Ojansivu ad62218ff8 Translate Moroccan Arabic advanced filter instructions
Replace retained English prose while preserving every source operator, quoted example, escape sequence and regex. Low-confidence technical wording requires native-speaker review.
2026-09-13 04:23:48 +03:00
Lauri Ojansivu 4766837e21 Refresh short audit after Moroccan Arabic repairs 2026-09-13 04:23:28 +03:00
Lauri Ojansivu a7ce595e67 Repair Moroccan Arabic calendar and import translations
Replace seventeen English and Tamazight findings. Preserve Trello menu identifiers, Markdown examples and calendar variants. Restore the omitted plain-list import behavior. Specialized terms require native-speaker review; advanced filter prose remains pending.
2026-09-13 04:23:19 +03:00
Lauri Ojansivu 5aa04eaa27 Refresh short audit after Frisian repairs 2026-09-13 04:22:54 +03:00
Lauri Ojansivu e4cde903ba Repair Frisian storage and calendar translations
Replace twenty retained English findings across both Frisian locale files. Preserve product identifiers and civil, astronomical and lunar observation distinctions. Specialized calendar wording requires language review.
2026-09-13 04:22:44 +03:00
Lauri Ojansivu 2746242e66 Refresh short audit after Wu Chinese repairs 2026-09-13 04:22:21 +03:00
Lauri Ojansivu d47ffc65ac Repair audited Wu Chinese storage and calendar labels
Replace three retained English findings using shared written technical vocabulary consistent with existing locale labels. Preserve product names and Saudi lunar observation meaning. Dialect-specific wording remains subject to native-speaker review.
2026-09-13 04:22:12 +03:00
Lauri Ojansivu 00126527a1 Refresh short audit after Cantonese repairs 2026-09-13 04:21:51 +03:00
Lauri Ojansivu 4a8085bfc5 Repair remaining audited Cantonese storage and calendar labels
Translate four retained English findings using simplified Chinese orthography. Preserve product names and lunar observation and astronomical tabular distinctions.
2026-09-13 04:21:42 +03:00
Lauri Ojansivu bf9bc602db Refresh short audit after Mandarin repairs 2026-09-13 04:21:23 +03:00
Lauri Ojansivu 8c09ca2212 Repair remaining audited Mandarin translations
Translate retained English storage and Trello export instructions and the Saudi lunar-sighting calendar label. Preserve product names and source menu identifiers.
2026-09-13 04:21:14 +03:00
Lauri Ojansivu c878263f65 Refresh short audit after Yiddish calendar repairs 2026-09-13 04:20:54 +03:00
Lauri Ojansivu 1ca205c071 Repair Yiddish calendar translations
Replace seventeen foreign-language calendar findings with Yiddish labels. Preserve distinct civil and astronomical epochs and Saudi lunar sighting. Specialized terminology requires language review.
2026-09-13 04:20:45 +03:00
Lauri Ojansivu 9999173b31 Refresh short audit after Odia repairs 2026-09-13 04:20:20 +03:00
Lauri Ojansivu 1ab4c0c6de Repair Odia rule and calendar translations
Replace ten findings, including Hindi rule text and English storage and calendar prose. Restore date format labels exactly without stray separators. Preserve case-insensitive rule meaning and lunar and astronomical distinctions. Specialized terminology requires native-speaker review.
2026-09-13 04:20:10 +03:00
Lauri Ojansivu d0afccdb55 Refresh short audit after remaining Khmer repairs 2026-09-13 04:19:46 +03:00
Lauri Ojansivu 9ff2d8cafc Translate remaining audited Khmer diagnostic and filter prose
Repair twelve findings across three locale tags, accounting for the shared-file alias. Preserve filter examples and escape sequences. Specialized wording requires native-speaker review.
2026-09-13 04:19:36 +03:00
Lauri Ojansivu 1860068c9e Refresh short audit after Khmer calendar repairs 2026-09-13 04:19:01 +03:00
Lauri Ojansivu 083832d0a7 Record Khmer calendar corrections for canonical locale alias 2026-09-13 04:19:01 +03:00
Lauri Ojansivu a792756794 Repair remaining Khmer calendar translations
Replace nine English calendar findings across three Khmer locale variants. Preserve the Indian national, Saudi lunar sighting and astronomical tabular distinctions. Specialized terminology requires native-speaker review; other Khmer findings remain pending.
2026-09-13 04:18:40 +03:00
Lauri Ojansivu c2e03ca060 Refresh short audit after Uyghur calendar repairs 2026-09-13 04:18:19 +03:00
Lauri Ojansivu 3ccbe11648 Repair Uyghur Hijri calendar translations
Replace five English calendar findings with Uyghur labels, preserving civil and astronomical epoch distinctions and Saudi lunar sighting. Specialized terminology requires native-speaker review.
2026-09-13 04:18:10 +03:00
Lauri Ojansivu 95cee11285 Refresh short audit after Central Kurdish calendar repairs 2026-09-13 04:17:51 +03:00
Lauri Ojansivu 325e530b17 Repair Central Kurdish calendar translations
Replace fifteen English calendar findings with Central Kurdish labels. Preserve civil and astronomical epoch distinctions and Saudi lunar sighting. Specialized terminology requires native-speaker review.
2026-09-13 04:17:41 +03:00
Lauri Ojansivu c1e440d676 Refresh short audit after Tatar calendar repairs 2026-09-13 04:17:17 +03:00
Lauri Ojansivu 51934887d2 Repair Tatar calendar translations
Replace seventeen foreign-language calendar findings with Tatar labels. Preserve distinct civil, astronomical and lunar observation variants. Specialized calendar terminology requires native-speaker review.
2026-09-13 04:17:08 +03:00
Lauri Ojansivu f9b1728c0c Refresh short audit after Latin calendar repairs 2026-09-13 04:16:47 +03:00
Lauri Ojansivu ade5ed0b9d Repair Latin calendar translations
Replace seventeen foreign-language calendar findings with Latin labels. Preserve calendar names and distinguish civil, astronomical and lunar observation variants. Specialized terminology remains subject to language review.
2026-09-13 04:16:34 +03:00
Lauri Ojansivu a1b39070d2 Refresh short audit after Neapolitan diagnostic review 2026-09-13 04:16:11 +03:00
Lauri Ojansivu 042f03566a Repair Neapolitan heap diagnostic and legal notice text
Describe the V8 heap overwrite diagnostic according to Node documentation. Match the legal acceptance prefix to the existing plural legal notice label. Leave the shared item example pending review. Low-confidence Neapolitan wording requires native-speaker review.
2026-09-13 04:16:02 +03:00
Lauri Ojansivu 7e3b0939a2 Refresh short audit after Neapolitan settings repairs 2026-09-13 04:15:41 +03:00
Lauri Ojansivu aca6a1d243 Repair Neapolitan calendar and account settings labels
Replace twenty-seven Italian findings covering date display, settings, migration controls and Trello credentials. Preserve ISO designation, API URL and minimum username length. Low-confidence wording requires native-speaker review.
2026-09-13 04:15:31 +03:00
Lauri Ojansivu ba270b4bf1 Refresh short audit after Neapolitan rule repairs 2026-09-13 04:15:03 +03:00
Lauri Ojansivu 493b16b6b6 Repair Neapolitan rule and S3 messages
Replace twenty-five Italian findings covering rules, migration controls, recovery and S3 settings. Preserve operator tokens, numeric labels, endpoint examples and console menu names. Leave the shared item example pending contextual review. Low-confidence wording requires native-speaker review.
2026-09-13 04:14:54 +03:00
Lauri Ojansivu 2f790db0c3 Refresh short audit after Neapolitan import repairs 2026-09-13 04:14:25 +03:00
Lauri Ojansivu c6ae3487b1 Repair Neapolitan import and migration translations
Replace thirty findings covering member mapping, imports, migrations, maps and monitoring. Preserve filenames, numeric limits and database identifiers. Restore the file progress label to its source meaning. Low-confidence wording requires native-speaker review.
2026-09-13 04:14:15 +03:00
Lauri Ojansivu 0b141852c7 Refresh short audit after Neapolitan export repairs 2026-09-13 04:13:45 +03:00
Lauri Ojansivu e92243bf2b Repair Neapolitan export and filter translations
Replace twenty-five Italian findings covering exports, filters, storage and import instructions. Clarify checked items and minicard label text; preserve search syntax and product names. Low-confidence wording requires native-speaker review; font preview is not certified as a pangram.
2026-09-13 04:13:35 +03:00
Lauri Ojansivu a77261217b Refresh short audit after Neapolitan email repairs 2026-09-13 04:13:07 +03:00
Lauri Ojansivu a0b070ef9e Repair Neapolitan email and permission labels
Replace twenty-five Italian findings, preserving site placeholders and zoom limits. Clarify email template body and subject labels and remove the stray English word in password reset. Low-confidence wording requires native-speaker review.
2026-09-13 04:12:57 +03:00
Lauri Ojansivu c750b08987 Refresh short audit after Neapolitan scheduled job repairs 2026-09-13 04:12:31 +03:00
Lauri Ojansivu c9c54e09a7 Repair Neapolitan checklist and scheduled job messages
Replace thirty Italian findings covering deletion confirmations, scheduled jobs, custom markup and storage migration. Keep filenames and database names unchanged. Low-confidence wording requires native-speaker review.
2026-09-13 04:12:22 +03:00
Lauri Ojansivu 3588b00670 Refresh short audit after Neapolitan attachment repairs 2026-09-13 04:11:52 +03:00
Lauri Ojansivu 2e1a9d87d6 Repair Neapolitan background and attachment messages
Replace twenty-six Italian findings with Neapolitan wording. Preserve attachment limits, interpolation tokens and Azure menu labels. Low-confidence terminology needs native-speaker review.
2026-09-13 04:11:42 +03:00
Lauri Ojansivu cc6f4a6302 Refresh short translation audit after Neapolitan activity repairs 2026-09-13 04:11:14 +03:00
Lauri Ojansivu eadb7aee03 Repair Neapolitan account and activity translations
Replace sixteen Italian findings, preserving reminder tokens and activity arguments. Correct checklist completion to describe the named checklist rather than a count. Low-confidence Neapolitan wording requires native-speaker review.
2026-09-13 04:11:04 +03:00
Lauri Ojansivu 0f890652f8 Keep translation audit as a short current progress summary 2026-09-13 04:10:38 +03:00
Lauri Ojansivu 682f858cc5 Repair Neapolitan memory and reactivity labels
Replace ten Italian findings, preserving RSS meaning, reactivity identifiers and loading indicator names. Low-confidence Neapolitan wording needs native-speaker review.
2026-09-13 04:08:24 +03:00
Lauri Ojansivu 76dd956b21 Refresh short audit after Neapolitan diagnostic repairs 2026-09-13 04:07:54 +03:00
Lauri Ojansivu 69cb1660d7 Repair Neapolitan diagnostic labels
Replace nine Italian findings, preserving DDP_TRANSPORT, MongoDB and malloc identities. Low-confidence Neapolitan wording needs native-speaker review.
2026-09-13 04:07:44 +03:00
Lauri Ojansivu a0cb117a0b Refresh short audit after Neapolitan workspace repairs 2026-09-13 04:07:19 +03:00
Lauri Ojansivu f3769d7f10 Repair Neapolitan workspace and attachment controls
Replace ten Italian findings, retaining workspace hierarchy, template container consistency and the HTML body tag. Low-confidence Neapolitan wording needs native-speaker review.
2026-09-13 04:07:10 +03:00
Lauri Ojansivu 71d4e19128 Refresh short audit after Neapolitan activity repairs 2026-09-13 04:06:45 +03:00
Lauri Ojansivu 1c2f67676c Repair Neapolitan activity messages
Replace eight Italian findings, preserving action placeholders and removing an erroneous numeral from subtask activity. Low-confidence Neapolitan wording needs native-speaker review.
2026-09-13 04:06:36 +03:00
Lauri Ojansivu 86e4798f53 Refresh short audit after Neapolitan calendar variants 2026-09-13 04:06:12 +03:00
Lauri Ojansivu 629586db32 Translate Neapolitan Hijri calendar variants
Replace six English findings, preserving Indian national identity and distinct Hijri epochs, Saudi moon sighting and Umm al-Qura. Low-confidence Neapolitan wording needs native-speaker review.
2026-09-13 04:06:04 +03:00
Lauri Ojansivu b1bd08b9fd Refresh short audit after Neapolitan calendar repairs 2026-09-13 04:05:40 +03:00
Lauri Ojansivu 9311ddeec3 Repair Neapolitan calendar selection labels
Replace eleven foreign-language calendar findings, preserving calendar identities. Low-confidence Neapolitan wording needs native-speaker review.
2026-09-13 04:05:30 +03:00
Lauri Ojansivu 942313ddab Refresh short audit after Aromanian advanced filter repair 2026-09-13 04:05:01 +03:00
Lauri Ojansivu a03c840b68 Repair Aromanian advanced filter instructions
Replace English prose and malformed escape examples, preserving source query syntax and operator precedence guidance. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 04:04:52 +03:00
Lauri Ojansivu 4bd867a020 Refresh short audit after Aromanian existence guidance repair 2026-09-13 04:04:28 +03:00
Lauri Ojansivu a421875fa1 Repair Aromanian field existence search guidance
Replace two Italian findings, preserving every field predicate, the negative existence example and legal-notice introduction. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 04:04:18 +03:00
Lauri Ojansivu 65528c2f53 Refresh short audit after Aromanian chart repairs 2026-09-13 04:03:57 +03:00
Lauri Ojansivu 1f5f9b530c Repair Aromanian Trello import and chart labels
Replace five Italian and English findings, retaining Trello menu labels and distinguishing remaining-work from completed-work charts. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 04:03:48 +03:00
Lauri Ojansivu 38334c95da Refresh short audit after Aromanian WIP repairs 2026-09-13 04:03:25 +03:00
Lauri Ojansivu d2d06ea5c4 Repair Aromanian WIP warnings and text controls
Replace twelve Italian and English findings, preserving over-limit warnings and consistent font/text labels. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 04:03:16 +03:00
Lauri Ojansivu f1d64f6660 Refresh short audit after Aromanian SMTP repairs 2026-09-13 04:02:51 +03:00
Lauri Ojansivu 12be61fb60 Repair Aromanian SMTP and board setting labels
Replace fifteen Italian findings, preserving SMTP/TLS identities, private-only visibility, username placeholders and optional authentication. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 04:02:42 +03:00
Lauri Ojansivu 744fcebadb Refresh short audit after Aromanian shortcut repairs 2026-09-13 04:02:16 +03:00
Lauri Ojansivu 0df8098593 Repair Aromanian shortcut and minicard setting labels
Replace eleven Italian findings, preserving WIP and ISO 8601 identifiers, assigned-card filtering and sidebar toggles. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 04:02:07 +03:00
Lauri Ojansivu c5e10d3ae4 Refresh short audit after Aromanian rule action repairs 2026-09-13 04:01:41 +03:00
Lauri Ojansivu 4958315cd7 Repair Aromanian checklist rule actions
Replace ten Italian findings, preserving check/uncheck opposites, comma-separated item examples, Enter key identity and WIP limit meaning. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 04:01:32 +03:00
Lauri Ojansivu c0e791b8f9 Refresh short audit after Aromanian validation repairs 2026-09-13 04:01:07 +03:00
Lauri Ojansivu 7d4cd882bf Repair Aromanian operator validation and preview messages
Replace nine Italian findings, retaining operator placeholders, login HTML links, overdue meaning and PDF download fallback. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 04:00:58 +03:00
Lauri Ojansivu 542fcc5a60 Refresh short audit after Aromanian archive repairs 2026-09-13 04:00:35 +03:00
Lauri Ojansivu d7997326a5 Repair Aromanian archive and notification labels
Replace ten Italian findings, preserving invitation acceptance, watched-item scope, debug placeholders and positive limit requirements. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 04:00:25 +03:00
Lauri Ojansivu 53e8f0f1fe Refresh short audit after Aromanian list repairs 2026-09-13 04:00:01 +03:00
Lauri Ojansivu 0af86f30f7 Repair Aromanian list actions and file size labels
Replace ten Italian findings, preserving irreversible history loss, all-card action scope and byte units. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:59:52 +03:00
Lauri Ojansivu 5a93d147ea Refresh short audit after Aromanian mapping repairs 2026-09-13 03:59:27 +03:00
Lauri Ojansivu c888d65719 Repair Aromanian member mapping and invitation labels
Replace nine Italian findings, retaining unmapped-member fallback, invitation failure/success, label placeholders and administrator requirement. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:59:18 +03:00
Lauri Ojansivu 497e9fb8e7 Refresh short audit after Aromanian status repairs 2026-09-13 03:58:55 +03:00
Lauri Ojansivu a0f54aed6b Repair Aromanian search status and import labels
Replace ten Italian findings, preserving public/private predicates, checklist completion and CSV/TSV/JSON identities. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:58:46 +03:00
Lauri Ojansivu c17d79a27e Refresh short audit after Aromanian search field repairs 2026-09-13 03:58:23 +03:00
Lauri Ojansivu a501f4223a Repair Aromanian search field descriptions
Replace eight Italian findings, retaining query tokens and examples; correct reversed modification-age wording. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:58:13 +03:00
Lauri Ojansivu fa23a4040d Refresh short audit after Aromanian operator repairs 2026-09-13 03:57:49 +03:00
Lauri Ojansivu 8fd0913872 Repair Aromanian search operator descriptions
Replace seven Italian findings, preserving query examples and date predicates; correct the reversed creation-age explanation. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:57:40 +03:00
Lauri Ojansivu 2fb82bb4d1 Refresh short audit after Aromanian filter repairs 2026-09-13 03:57:14 +03:00
Lauri Ojansivu 0be8065e89 Repair Aromanian user errors and filter labels
Replace nine Italian findings, retaining self-invitation restrictions, username conflicts and next-week due filtering. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:57:05 +03:00
Lauri Ojansivu 6484e0cd9f Refresh short audit after Aromanian error repairs 2026-09-13 03:56:43 +03:00
Lauri Ojansivu 1a3698003f Repair Aromanian import and authorization errors
Replace ten Italian findings, preserving JSON versus schema failures, CSV/TSV identities and authorization restrictions. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:56:35 +03:00
Lauri Ojansivu 4f1786581e Refresh short audit after Aromanian account email repairs 2026-09-13 03:56:10 +03:00
Lauri Ojansivu 0ad176dd2a Repair Aromanian account email messages
Replace six Italian findings, preserving account enrollment, password reset and email verification purposes, placeholders and literal newline sequences. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:56:01 +03:00
Lauri Ojansivu 4027f84926 Refresh short audit after Aromanian due card repairs 2026-09-13 03:55:38 +03:00
Lauri Ojansivu 31db563be0 Repair Aromanian due card and email subject labels
Replace eight Italian findings, preserving incomplete-card permission scope, current-day due dates and site-name placeholders. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:55:30 +03:00
Lauri Ojansivu b04fd4d084 Refresh short audit after Aromanian deletion repairs 2026-09-13 03:55:06 +03:00
Lauri Ojansivu dee63040c3 Repair Aromanian deletion warnings and search labels
Replace eight Italian findings, preserving irreversible deletion, linked-card ordering, organization membership restriction and numeric shortcuts. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:54:57 +03:00
Lauri Ojansivu 2b231b1c85 Refresh short audit after Aromanian branding repairs 2026-09-13 03:54:33 +03:00
Lauri Ojansivu f959fdb328 Repair Aromanian branding setting labels
Replace eight Italian findings, retaining image-versus-link URLs, top-left logo location and default height 27. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:54:25 +03:00
Lauri Ojansivu cff7c6c44c Refresh short audit after Aromanian attachment repairs 2026-09-13 03:54:02 +03:00
Lauri Ojansivu d3222a8ead Repair Aromanian attachment and account status labels
Replace ten Italian findings, preserving activation versus deactivation, filename categories, comment placeholders and Enter key identity. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:53:53 +03:00
Lauri Ojansivu b302478a10 Refresh short audit after Aromanian reminder repairs 2026-09-13 03:53:29 +03:00
Lauri Ojansivu 3d1ff7dda8 Repair Aromanian due reminders and custom field activity
Replace nine Italian findings, preserving approaching/current/past deadlines, all placeholders and HTML closing tags. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:53:21 +03:00
Lauri Ojansivu c1ddd8a05a Refresh short audit after Aromanian accessibility repairs 2026-09-13 03:52:55 +03:00
Lauri Ojansivu 67c3928f75 Repair Aromanian accessibility and login limit messages
Replace ten Italian findings, preserving seconds units, failed-login thresholds and old/new time placeholders. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:52:47 +03:00
Lauri Ojansivu a2a2051fe7 Refresh short audit after Aromanian time repairs 2026-09-13 03:52:24 +03:00
Lauri Ojansivu fc8666fcc4 Repair Aromanian memory and time activity labels
Replace seven Italian findings, retaining Node identity, distinct time events and individual-user unlock confirmation. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:52:15 +03:00
Lauri Ojansivu d09a7001f9 Refresh short audit after Aromanian tracking repairs 2026-09-13 03:51:54 +03:00
Lauri Ojansivu 84041e6f1d Repair Aromanian board tracking and subtask labels
Replace nine Italian findings, preserving starred-board placement, week start selection, tracking scope and PDF permission failures. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:51:46 +03:00
Lauri Ojansivu 046e63c196 Refresh short audit after Aromanian visibility repairs 2026-09-13 03:51:22 +03:00
Lauri Ojansivu 054df182c0 Repair Aromanian membership and board visibility wording
Replace nine Italian findings, retaining public view versus member edit permissions, removal notifications and shortcut actions. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:51:14 +03:00
Lauri Ojansivu c07410beb0 Refresh short audit after Aromanian movement repairs 2026-09-13 03:50:50 +03:00
Lauri Ojansivu 6be6c259f5 Repair Aromanian card movement rule labels
Replace ten Italian findings, preserving top/bottom destinations, archive restoration, member removal and rule fragments. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:50:42 +03:00
Lauri Ojansivu 2c6564ffd4 Refresh short audit after Aromanian checklist repairs 2026-09-13 03:50:20 +03:00
Lauri Ojansivu 4921196f7a Repair Aromanian checklist and access descriptions
Replace seven Italian findings, preserving private-board permissions, original line order, comma-separated input and invitation placeholders. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:50:11 +03:00
Lauri Ojansivu 75520d22f3 Refresh short audit after Aromanian query repairs 2026-09-13 03:49:49 +03:00
Lauri Ojansivu aa3e939ff8 Repair Aromanian search query instructions
Replace three Italian findings, preserving literal query examples, AND semantics, quoting requirements and archive restoration steps. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:49:40 +03:00
Lauri Ojansivu 5bb9286089 Refresh short audit after Aromanian import repairs 2026-09-13 03:49:18 +03:00
Lauri Ojansivu 171dc12580 Repair Aromanian board import instructions
Replace seven Italian findings, retaining ZIP/JSON structure, export workflow, archive preservation and muted notification behavior. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:49:10 +03:00
Lauri Ojansivu e4a1b60c4a Refresh short audit after Aromanian search repairs 2026-09-13 03:48:46 +03:00
Lauri Ojansivu ff910b6ac7 Repair Aromanian search and checklist messages
Replace seven Italian findings, preserving sort predicates, limit notation, board-title placeholders and checked-item visibility. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:48:35 +03:00
Lauri Ojansivu ca86da3ec3 Refresh short audit after Aromanian invitation repairs 2026-09-13 03:48:10 +03:00
Lauri Ojansivu 4b6c72504a Repair Aromanian invitation email translations
Replace two Italian invitation messages, preserving all interpolation tokens and literal newline sequences. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:48:02 +03:00
Lauri Ojansivu 05378c64dd Refresh short audit after Aromanian permission repairs 2026-09-13 03:47:41 +03:00
Lauri Ojansivu 9fae341430 Repair Aromanian board permission and linked card messages
Replace six Italian findings, preserving administrator versus member requirements, linked-card deletion ordering and WIP identity. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:47:32 +03:00
Lauri Ojansivu 84c59d9476 Refresh short audit after Aromanian board repairs 2026-09-13 03:47:11 +03:00
Lauri Ojansivu 12962afdc5 Repair Aromanian board deletion and subtask wording
Replace nine Italian findings, retaining permanent deletion warnings, board placeholders and opposite creation-date sort directions. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:47:03 +03:00
Lauri Ojansivu 0b91b1e79a Refresh short audit after Aromanian card field repairs 2026-09-13 03:46:39 +03:00
Lauri Ojansivu f29470a119 Repair Aromanian card field and attachment controls
Replace six Italian findings, preserving all-card versus new-card behavior, GridFS identity and board placeholders. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:46:31 +03:00
Lauri Ojansivu 6bc27d1668 Refresh short audit after Aromanian activity repairs 2026-09-13 03:46:10 +03:00
Lauri Ojansivu fb511e7464 Repair Aromanian activity and description messages
Replace six Italian findings, preserving label and attachment actions, format placeholders and the HTML body tag. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:46:02 +03:00
Lauri Ojansivu 7318f67da5 Refresh short audit after Aromanian login repairs 2026-09-13 03:45:40 +03:00
Lauri Ojansivu c1f2b35cee Repair Aromanian login protection messages
Replace six Italian findings, retaining known-user versus nonexistent-user conditions and failed-login lockout meaning. Low-confidence Aromanian wording needs native-speaker review.
2026-09-13 03:45:31 +03:00
Lauri Ojansivu 8a66709400 Refresh short audit after Aromanian account repairs 2026-09-13 03:45:08 +03:00
Lauri Ojansivu 05ba8e6c14 Repair Aromanian account and unlock labels
Replace seven Italian findings using existing Aromanian account terminology. Preserve account deletion and unlock-all confirmation semantics. Low-confidence wording needs native-speaker review.
2026-09-13 03:45:00 +03:00
Lauri Ojansivu a46d5dfdfc Refresh short audit after Aromanian calendar variants 2026-09-13 03:44:35 +03:00
Lauri Ojansivu 3d8a4c0392 Translate Aromanian Hijri calendar variants
Replace six English calendar findings, preserving civil and astronomical epochs, Saudi moon sighting and Umm al-Qura identities. Aromanian wording has low confidence and needs native-speaker review.
2026-09-13 03:44:27 +03:00
Lauri Ojansivu 5a5e7ef4c6 Refresh short audit after Aromanian calendar repairs 2026-09-13 03:43:58 +03:00
Lauri Ojansivu 4bc4039295 Translate Aromanian calendar labels
Replace ten English calendar names with Aromanian wording, retaining calendar identities. Replacements have low confidence and need native-speaker review.
2026-09-13 03:43:50 +03:00
Lauri Ojansivu ff10f8efdd Refresh short audit after Ladin heap diagnostic repair 2026-09-13 03:43:24 +03:00
Lauri Ojansivu 9e3dd72082 Clarify Ladin heap overwrite diagnostic
Translate the remaining English heap label using the documented V8 bit-pattern overwrite meaning. Ladin wording has low confidence and needs native-speaker review.
2026-09-13 03:43:14 +03:00
Lauri Ojansivu 8006a40204 Refresh short audit after Ladin calendar repairs 2026-09-13 03:42:56 +03:00
Lauri Ojansivu 69e92e0e07 Repair Ladin calendar names and account controls
Replace twenty-six Italian and English findings, retaining API URLs, minimum username length and distinct Hijri variants. Low-confidence Ladin wording needs native-speaker review; one technical heap label remains pending.
2026-09-13 03:42:47 +03:00
Lauri Ojansivu 557d4cf07c Refresh short audit after Ladin storage controls repairs 2026-09-13 03:42:22 +03:00
Lauri Ojansivu 70f7052ff1 Repair Ladin date rules and storage controls
Replace seventeen Italian findings, preserving endpoint examples, AWS menu names and WIP identifiers. Ladin wording has low confidence and needs native-speaker review.
2026-09-13 03:42:14 +03:00
Lauri Ojansivu 85876d4c2c Refresh short audit after Ladin monitoring repairs 2026-09-13 03:41:50 +03:00
Lauri Ojansivu ccc4b9d7e6 Repair Ladin monitoring and rule import messages
Replace thirteen Italian findings, preserving HTML links, count tokens, JSON/CSV identifiers and distinct selection states. Low-confidence Ladin wording needs native-speaker review.
2026-09-13 03:41:40 +03:00
Lauri Ojansivu 8f83e2d805 Refresh short audit after Ladin filter repairs 2026-09-13 03:41:18 +03:00
Lauri Ojansivu 4ba4748b88 Repair Ladin filter and map detection wording
Replace eleven Italian findings covering filters, avatar URLs, font defaults, search operators and imports. Preserve CSV/TSV identifiers; Ladin wording has low confidence and needs native-speaker review.
2026-09-13 03:41:09 +03:00
Lauri Ojansivu 4fb8a2084d Refresh short audit after Ladin email repairs 2026-09-13 03:40:46 +03:00
Lauri Ojansivu d760c8e7b9 Repair Ladin vote date and invitation email wording
Replace nine Italian findings, retaining enrollment placeholders, literal newline sequences, zoom limits and WIP terminology. Low-confidence Ladin wording needs native-speaker review.
2026-09-13 03:40:37 +03:00
Lauri Ojansivu c7a39eede7 Refresh short audit after Ladin formatting repairs 2026-09-13 03:40:17 +03:00
Lauri Ojansivu 4e7d19f38b Repair Ladin formatting and text migration labels
Replace nine Italian findings, preserving the value placeholder, HTML/JSON terminology and database identities. Ladin wording has low confidence and needs native-speaker review.
2026-09-13 03:40:09 +03:00
Lauri Ojansivu e7757dee0a Refresh concise audit after Ladin scheduled job repairs 2026-09-13 03:39:43 +03:00
Lauri Ojansivu cf96f6ff14 Repair Ladin clipboard and scheduled job messages
Replace six Italian findings with Ladin wording, preserving distinct pause, resume and start failures. Replacements have low confidence and need native-speaker review.
2026-09-13 03:39:35 +03:00
Lauri Ojansivu 09347e5491 Refresh concise translation audit progress summary 2026-09-13 03:39:10 +03:00
Lauri Ojansivu db752d2475 Repair Ladin checklist controls and cleanup labels
Replace six wrong-language findings, retaining checklist count formatting, deletion confirmation and Persian calendar identity. Replacements have low confidence and need native-speaker review.
2026-09-13 03:37:11 +03:00
Lauri Ojansivu 648fd5e724 Refresh short audit after Ladin storage label repairs 2026-09-13 03:36:47 +03:00
Lauri Ojansivu 69d2c59eab Repair Ladin storage and time summary labels
Replace six Italian findings while preserving due-time placeholders, blob container identity and file counting meaning. Replacements have low confidence and need native-speaker review.
2026-09-13 03:36:37 +03:00
Lauri Ojansivu 6e7310ce51 Refresh short audit after Ladin background repairs 2026-09-13 03:36:14 +03:00
Lauri Ojansivu 0e1d552b18 Repair Ladin background and field activity instructions
Replace six Italian findings, preserving field placeholder order, closing body tag and system-wide announcement status. Replacements have low confidence and need native-speaker review.
2026-09-13 03:36:04 +03:00
Lauri Ojansivu 10dd2dd486 Refresh short audit after Ladin activity repairs 2026-09-13 03:35:39 +03:00
Lauri Ojansivu b956aad47f Repair Ladin reminders and checklist activity text
Replace six Italian findings while preserving reminder tokens and checklist completion action semantics. Replacements have low confidence and need native-speaker review.
2026-09-13 03:35:30 +03:00
Lauri Ojansivu 0ce2f3c3c5 Refresh short audit after Ladin memory context repairs 2026-09-13 03:35:07 +03:00
Lauri Ojansivu 2af8c31a20 Repair Ladin memory context and spinner labels
Replace six mixed-language findings while retaining native/detached context distinctions, malloc and RSS identities. Technical wording has low confidence and needs native-speaker review.
2026-09-13 03:34:57 +03:00
Lauri Ojansivu afd46ddf1d Refresh short audit after Ladin runtime label repairs 2026-09-13 03:34:32 +03:00
Lauri Ojansivu d0bb6d2bbf Repair Ladin spinner and storage metric labels
Replace five mixed-language findings while preserving spinner names, DDP_TRANSPORT and malloc. Technical wording has low confidence and needs native-speaker review; the garbage-zapping finding remains pending.
2026-09-13 03:34:23 +03:00
Lauri Ojansivu 731d29c4c3 Refresh short audit after initial Ladin repairs 2026-09-13 03:33:59 +03:00
Lauri Ojansivu aecc2c36b4 Repair Ladin calendar setting and checklist activity
Replace three wrong-language findings while preserving activity placeholder order. Ladin replacements have low confidence and require native-speaker review.
2026-09-13 03:33:50 +03:00
Lauri Ojansivu a2d4cd1ef7 Refresh short audit after Corsican calendar variant repairs 2026-09-13 03:33:21 +03:00
Lauri Ojansivu db7be543cb Repair Corsican calendar variant names
Replace nine English findings, preserving lunar sighting, civil versus astronomical epochs, Umm al-Qura and Minguo identities. Wording needs native-speaker review.
2026-09-13 03:33:11 +03:00
Lauri Ojansivu 124ecf1649 Refresh short audit after Corsican calendar label repairs 2026-09-13 03:32:47 +03:00
Lauri Ojansivu aff6e2ab06 Repair Corsican WIP validation and calendar labels
Replace eight wrong-language findings, preserving exceeded-limit semantics and distinct Dangi, Ethiopic and Amete Alem calendar identities. Wording needs native-speaker review.
2026-09-13 03:32:37 +03:00
Lauri Ojansivu cb54d0d981 Refresh short audit after Corsican account validation repairs 2026-09-13 03:32:13 +03:00
Lauri Ojansivu 7072bdad02 Repair Corsican account validation and vote warnings
Replace eight Italian findings, preserving username minimum length, permanent vote deletion and optional webhook authentication. Wording needs native-speaker review.
2026-09-13 03:32:03 +03:00
Lauri Ojansivu 3d6e9748d5 Refresh short audit after Corsican theme repairs 2026-09-13 03:31:38 +03:00
Lauri Ojansivu 0b9c4990ce Repair Corsican theme and Trello credential settings
Replace eight Italian findings, preserving all-tenant override scope, administrator contact instructions and both-required API credentials. Wording needs native-speaker review.
2026-09-13 03:31:29 +03:00
Lauri Ojansivu f0146f646b Refresh short audit after Corsican swimlane warning repairs 2026-09-13 03:31:03 +03:00
Lauri Ojansivu 63732fb1bb Repair Corsican migration and swimlane warnings
Replace eight Italian findings, preserving all-migration start/stop actions, swimlane deletion irreversibility and title placeholders. Wording needs native-speaker review.
2026-09-13 03:30:53 +03:00
Lauri Ojansivu cd6e9d9b2e Refresh short audit after Corsican SMTP repairs 2026-09-13 03:30:27 +03:00
Lauri Ojansivu 562343386f Repair Corsican SMTP and assigned card shortcut text
Replace eight Italian findings, retaining outgoing email port semantics, assigned-to-me filtering and drag-order sorting. Wording needs native-speaker review.
2026-09-13 03:30:18 +03:00
Lauri Ojansivu f09f97ee36 Refresh short audit after Corsican troubleshooting repairs 2026-09-13 03:29:54 +03:00
Lauri Ojansivu 62113f54ed Repair Corsican troubleshooting and secure S3 instructions
Replace eight Italian findings, preserving server log commands, SSL/TLS, mandatory secret keys and keyboard Enter instructions. Wording needs native-speaker review.
2026-09-13 03:29:44 +03:00
Lauri Ojansivu e8c73c745e Refresh short audit after Corsican S3 setup repairs 2026-09-13 03:29:19 +03:00
Lauri Ojansivu 033f2772cc Repair Corsican S3 connection and authentication settings
Replace eight Italian findings, preserving endpoint examples, region codes, AWS menu names and secret-key versus access-key meanings. Wording needs native-speaker review.
2026-09-13 03:29:09 +03:00
Lauri Ojansivu 88734d1b06 Refresh short audit after Corsican recovery repairs 2026-09-13 03:28:43 +03:00
Lauri Ojansivu 1525e8508e Repair Corsican recovery and S3 access instructions
Replace eight Italian findings, preserving automatic recovery continuation, restored/remaining tokens and label range. Wording needs native-speaker review.
2026-09-13 03:28:34 +03:00
Lauri Ojansivu efaed48f9b Refresh short audit after Corsican automation repairs 2026-09-13 03:28:05 +03:00
Lauri Ojansivu 7fecb9247f Repair Corsican automation import and relative date wording
Replace eight Italian findings while preserving import count tokens, comma-separated examples, unchecked actions and relative date semantics. Wording needs native-speaker review.
2026-09-13 03:27:55 +03:00
Lauri Ojansivu 40de23ee18 Refresh short audit after Corsican private page repairs 2026-09-13 03:27:30 +03:00
Lauri Ojansivu 8cd048deda Repair Corsican private page and migration controls
Replace eight Italian findings, preserving login link markup, overdue timing, all-versus-single pause actions and empty-field matching behavior. Wording needs native-speaker review.
2026-09-13 03:27:20 +03:00
Lauri Ojansivu 295f310ea6 Refresh short audit after Corsican search validation repairs 2026-09-13 03:26:52 +03:00
Lauri Ojansivu d4ffd8c026 Repair Corsican search validation and OIDC button wording
Replace eight Italian findings, preserving placeholder inventories, positive-integer limits and invalid-status meanings. Wording needs native-speaker review.
2026-09-13 03:26:42 +03:00
Lauri Ojansivu 20a4dcc3ca Refresh short audit after Corsican monitoring repairs 2026-09-13 03:26:18 +03:00
Lauri Ojansivu dc1d842737 Repair Corsican monitoring and multi-selection labels
Replace eight Italian findings, retaining export versus refresh failures, read-enabled storage selection and empty-state meanings. Wording needs native-speaker review.
2026-09-13 03:26:09 +03:00
Lauri Ojansivu 0a50f1c5ae Refresh short audit after Corsican migration warning repairs 2026-09-13 03:25:46 +03:00
Lauri Ojansivu e3180a3360 Repair Corsican migration warnings and MongoDB labels
Replace eight Italian findings, preserving stop confirmation, background continuation warning and compact/GridFS identifiers. Wording needs native-speaker review.
2026-09-13 03:25:37 +03:00
Lauri Ojansivu a00a6ef638 Refresh short audit after Corsican migration limit repairs 2026-09-13 03:25:10 +03:00
Lauri Ojansivu 9ea03df1f5 Repair Corsican migration limits and map instructions
Replace eight Italian findings, retaining batch and delay bounds, pause/resume failure distinctions and unread action. Wording needs native-speaker review.
2026-09-13 03:25:01 +03:00
Lauri Ojansivu 05cfdf5540 Refresh short audit after Corsican deletion warning repairs 2026-09-13 03:24:37 +03:00
Lauri Ojansivu fdd1379952 Repair Corsican keyboard controls and deletion warnings
Replace eight Italian findings while preserving domain syntax, four-digit years, administrator requirements and irreversible list deletion. Wording needs native-speaker review.
2026-09-13 03:24:28 +03:00
Lauri Ojansivu 26824129fa Refresh short audit after Corsican import failure repairs 2026-09-13 03:24:03 +03:00
Lauri Ojansivu ecb2aed6ee Repair Corsican import failures and mapping messages
Replace eight Italian findings, preserving imported/unmatched count tokens and distinct ZIP size, read and import failures. Wording needs native-speaker review.
2026-09-13 03:23:54 +03:00
Lauri Ojansivu 45df0536ed Refresh short audit after Corsican search instruction repairs 2026-09-13 03:23:30 +03:00
Lauri Ojansivu 4d13c986f7 Repair Corsican search and import instructions
Replace eight Italian findings while preserving search tokens, Asana JSON and endpoint examples and CollectionFS migration requirements. Wording needs native-speaker review.
2026-09-13 03:23:21 +03:00
Lauri Ojansivu ed3947d813 Refresh short audit after Corsican cloud storage repairs 2026-09-13 03:22:55 +03:00
Lauri Ojansivu 8524940b9d Repair Corsican font preview and cloud storage setup wording
Replace eight Italian findings, preserving preview digits, JSON credentials and Google Cloud menu identifiers. Wording needs native-speaker review.
2026-09-13 03:22:46 +03:00
Lauri Ojansivu 27a65df508 Refresh short audit after Corsican filesystem repairs 2026-09-13 03:22:21 +03:00
Lauri Ojansivu a2f5d7f1e9 Repair Corsican filesystem and card filter labels
Replace eight Italian findings, retaining opposite storage states, next-week due filtering and custom-field absence. Wording needs native-speaker review.
2026-09-13 03:22:11 +03:00
Lauri Ojansivu 9199d5980c Refresh short audit after Corsican validation repairs 2026-09-13 03:21:45 +03:00
Lauri Ojansivu 78c018f234 Repair Corsican validation errors and export categories
Replace ten Italian findings, retaining zoom bounds, authorization restrictions and all export date and person categories. Wording needs native-speaker review.
2026-09-13 03:21:36 +03:00
Lauri Ojansivu 9bf7143eef Refresh short audit after Corsican email template repairs 2026-09-13 03:21:12 +03:00
Lauri Ojansivu f57dbab258 Repair Corsican email template and verification labels
Replace eight Italian findings, preserving site-name tokens and email body versus subject distinctions. Wording needs native-speaker review.
2026-09-13 03:21:02 +03:00
Lauri Ojansivu d17e8e04cb Refresh concise audit after Corsican vote date repairs 2026-09-13 03:20:40 +03:00
Lauri Ojansivu 2dbf0fd758 Repair Corsican resize and vote date instructions
Replace eight Italian findings, preserving change-count placeholders, vote end-date scope and invitation rules when self-registration is disabled. Wording needs native-speaker review.
2026-09-13 03:20:30 +03:00
Lauri Ojansivu c70ea152df Refresh short audit after Corsican default storage repairs 2026-09-13 03:20:05 +03:00
Lauri Ojansivu cb892a9e40 Repair Corsican default storage and deletion confirmations
Replace eight Italian findings, preserving new-upload destination selection, irreversible deletion and subtask landing-list meaning. Wording needs native-speaker review.
2026-09-13 03:19:56 +03:00
Lauri Ojansivu bf8f4063ad Refresh short audit after Corsican branding repairs 2026-09-13 03:19:31 +03:00
Lauri Ojansivu cadc25e458 Repair Corsican branding and database migration text
Replace eight Italian findings, preserving logo height defaults, image versus link URLs and text-only database migration scope. Wording needs native-speaker review.
2026-09-13 03:19:22 +03:00
Lauri Ojansivu 104b435966 Refresh concise audit after Corsican custom HTML repairs 2026-09-13 03:18:58 +03:00
Lauri Ojansivu 90d36347f1 Repair Corsican custom HTML and login logo settings
Replace eight Italian findings, preserving the value format token, HTML tag names and distinct image versus link URL controls. Wording needs native-speaker review.
2026-09-13 03:18:49 +03:00
Lauri Ojansivu 2237638708 Refresh short audit after Corsican migration retry repairs 2026-09-13 03:18:24 +03:00
Lauri Ojansivu a8c54b3c77 Repair Corsican migration retry and configuration instructions
Replace eight Italian findings while retaining paused versus failed migrations, assetlinks.json and keyboard Enter behavior. Wording needs native-speaker review.
2026-09-13 03:18:15 +03:00
Lauri Ojansivu 061716cc00 Refresh short audit after Corsican checklist confirmations 2026-09-13 03:17:52 +03:00
Lauri Ojansivu 9df1f36ddf Repair Corsican checklist confirmations and scheduled job errors
Replace eight Italian findings while retaining destructive-action confirmations and distinct delete, pause and resume failures. Wording needs native-speaker review.
2026-09-13 03:17:42 +03:00
Lauri Ojansivu 6fc4b11756 Refresh concise audit after Corsican list width repairs 2026-09-13 03:17:18 +03:00
Lauri Ojansivu bd3774e26f Repair Corsican list width and saved secret instructions
Replace eight Italian findings, preserving opposite enable/disable and favorite actions and blank-keeps-current-secret behavior. Wording needs native-speaker review.
2026-09-13 03:17:06 +03:00
Lauri Ojansivu 38f1781cc8 Refresh short audit after Corsican card completion repairs 2026-09-13 03:16:44 +03:00
Lauri Ojansivu b76619fa43 Repair Corsican card completion and board summary labels
Replace eight wrong-language findings, preserving completion negation, checklist count formatting and Persian calendar identity. Wording needs native-speaker review.
2026-09-13 03:16:34 +03:00
Lauri Ojansivu 204621ab58 Refresh short audit after Corsican background repairs 2026-09-13 03:16:11 +03:00
Lauri Ojansivu e5d2d2dbf0 Repair Corsican Azure and board background messages
Replace eight Italian findings while preserving Azure menu labels, background size tokens and deletion confirmation. Wording needs native-speaker review.
2026-09-13 03:16:02 +03:00
Lauri Ojansivu 49c3ff396f Refresh concise audit after Corsican transfer limit repairs 2026-09-13 03:15:39 +03:00
Lauri Ojansivu f12c25f5eb Repair Corsican transfer limits and Azure setup text
Replace eight Italian findings, preserving avatar size tokens, Azure menu labels and one-URL-scheme-per-line behavior. Wording needs native-speaker review.
2026-09-13 03:15:31 +03:00
Lauri Ojansivu 75bc7eb0c0 Refresh short audit after Corsican announcement repairs 2026-09-13 03:15:08 +03:00
Lauri Ojansivu 603aa87ed5 Repair Corsican announcements and attachment validation
Replace eight Italian findings, preserving WITH_API=true, positive limit requirements and announcement status semantics. Wording needs native-speaker review.
2026-09-13 03:14:58 +03:00
Lauri Ojansivu 6d2cdd9869 Refresh concise audit after Corsican activity repairs 2026-09-13 03:14:35 +03:00
Lauri Ojansivu 74449b131b Repair Corsican custom field and checklist activity wording
Replace ten Italian findings, restoring incomplete-marking and field-unsetting actions while retaining placeholder order and the body closing tag. Wording needs native-speaker review.
2026-09-13 03:14:26 +03:00
Lauri Ojansivu c3fc5ec1b4 Refresh short audit after Corsican reminder repairs 2026-09-13 03:14:01 +03:00
Lauri Ojansivu 9580ab05ec Repair Corsican due reminders and checklist activity
Replace eight Italian findings while preserving reminder timing, old/new date tokens and checklist action semantics. Wording needs native-speaker review.
2026-09-13 03:13:53 +03:00
Lauri Ojansivu d981c39f32 Refresh short audit after Corsican account lockout repairs 2026-09-13 03:13:29 +03:00
Lauri Ojansivu 2c7a7444c4 Repair Corsican accessibility and account lockout text
Replace seven Italian findings while preserving temporary lockout, failed-attempt thresholds and seconds units. Leave uncertain shared reactivity wording pending. Wording needs native-speaker review.
2026-09-13 03:13:21 +03:00
Lauri Ojansivu 9debe08fdf Refresh concise audit after Corsican memory label repairs 2026-09-13 03:12:55 +03:00
Lauri Ojansivu 6592fa202a Repair Corsican memory usage and reactivity labels
Replace ten mixed-language findings, preserving reactivity identifiers and resident versus heap memory distinctions. Technical wording has low confidence and needs native-speaker review.
2026-09-13 03:12:46 +03:00
Lauri Ojansivu 185417e7b3 Refresh concise audit after Corsican heap metric repairs 2026-09-13 03:12:23 +03:00
Lauri Ojansivu 9939bff193 Repair Corsican Node heap metric labels
Replace eight Italian metric labels while retaining native versus detached contexts and available, executable, physical and used memory distinctions. Technical wording has low confidence and needs native-speaker review.
2026-09-13 03:12:14 +03:00
Lauri Ojansivu ef50423da9 Refresh concise audit after Corsican runtime label repairs 2026-09-13 03:11:51 +03:00
Lauri Ojansivu 5fae9dca2d Repair Corsican storage settings and runtime labels
Replace ten mixed-language findings, preserving DDP_TRANSPORT, spinner names and malloc. Runtime terminology has low confidence and needs native-speaker review.
2026-09-13 03:11:43 +03:00
Lauri Ojansivu e4cbb0ccf6 Refresh short audit after initial Corsican repairs 2026-09-13 03:11:12 +03:00
Lauri Ojansivu e1a17fc67c Repair Corsican calendar and account protection wording
Replace eight wrong-language findings, preserving activity placeholders, protection semantics and oldest-first ordering. Corsican wording remains subject to native-speaker review.
2026-09-13 03:11:03 +03:00
Lauri Ojansivu ef234de9f6 Record cleared Romansh findings in concise translation audit 2026-09-13 03:10:34 +03:00
Lauri Ojansivu acb29a66de Repair remaining flagged Romansh upload account and calendar text
Replace fifteen mixed-language or English findings, restore account anonymization meaning and distinguish sighting and astronomical-epoch calendars. Wording remains subject to native-speaker review.
2026-09-13 03:10:25 +03:00
Lauri Ojansivu 62d52f3671 Refresh short audit after Romansh display setting repairs 2026-09-13 03:09:58 +03:00
Lauri Ojansivu 56aea8f250 Repair Romansh display settings and Trello credentials
Replace fifteen mixed-language findings while preserving API URLs, placeholders and the requirement for both credentials. Wording remains subject to native-speaker review.
2026-09-13 03:09:49 +03:00
Lauri Ojansivu 263e7b1339 Refresh concise audit after Romansh shortcut repairs 2026-09-13 03:09:22 +03:00
Lauri Ojansivu fd8871af21 Repair Romansh shortcuts and server troubleshooting text
Replace fifteen mixed-language findings, preserving server log commands, AWS menu names, SSL/TLS and assigned-to-me filtering. Wording remains subject to native-speaker review.
2026-09-13 03:09:14 +03:00
Lauri Ojansivu 078109b0a3 Refresh short audit after Romansh schedule rule repairs 2026-09-13 03:08:45 +03:00
Lauri Ojansivu c94415d359 Repair Romansh schedule rules and card controls
Replace fifteen mixed-language findings, retaining weekday boundaries, relative-date behavior, read-only permissions and S3 region syntax. Wording remains subject to native-speaker review.
2026-09-13 03:08:36 +03:00
Lauri Ojansivu 6c7d8de641 Refresh short audit after Romansh rule import repairs 2026-09-13 03:08:09 +03:00
Lauri Ojansivu 0e9c61c175 Repair Romansh rule import and attachment instructions
Replace fifteen mixed-language findings while preserving link markup, placeholders, workflow product names and import limitations. Wording remains subject to native-speaker review.
2026-09-13 03:07:59 +03:00
Lauri Ojansivu 762bffa00c Refresh short audit after Romansh search validation repairs 2026-09-13 03:07:30 +03:00
Lauri Ojansivu e9d5988201 Repair Romansh selection controls and search validation
Replace fourteen mixed-language findings while preserving placeholders, positive-integer limits and assigned-card visibility. Wording remains subject to native-speaker review.
2026-09-13 03:07:22 +03:00
Lauri Ojansivu 6fa53cdcaa Refresh concise audit after Romansh storage message repairs 2026-09-13 03:06:56 +03:00
Lauri Ojansivu fd1b2cb213 Repair Romansh migration monitoring and storage messages
Replace twelve mixed-language findings while preserving storage names, read-enabled selection and distinct completed and stopped states. Wording remains subject to native-speaker review.
2026-09-13 03:06:48 +03:00
Lauri Ojansivu fb4bb1afef Refresh short audit after Romansh migration repairs 2026-09-13 03:06:22 +03:00
Lauri Ojansivu 1cc3a2c1b3 Repair Romansh migration controls and unread action
Replace twelve mixed-language findings, retaining byte units, batch limits and distinct migration failure and success states. Wording remains subject to native-speaker review.
2026-09-13 03:06:13 +03:00
Lauri Ojansivu 00162b7eea Refresh concise audit after Romansh invitation and mapping repairs 2026-09-13 03:05:48 +03:00
Lauri Ojansivu 21d77baef0 Repair Romansh invitation location and account mapping wording
Replace twelve mixed-language findings, preserve label placeholders and domain syntax, and retain the requirement for at least one administrator. Wording remains subject to native-speaker review.
2026-09-13 03:05:40 +03:00
Lauri Ojansivu 26691e3217 Refresh short audit after Romansh import message repairs 2026-09-13 03:05:13 +03:00
Lauri Ojansivu 7e4307a9f5 Repair Romansh import rejection and member mapping messages
Replace twelve mixed-language findings while retaining ZIP rejection reasons, import/export selection behavior and deferred member mapping. Wording remains subject to native-speaker review.
2026-09-13 03:05:05 +03:00
Lauri Ojansivu 22972d8889 Refresh concise audit after Romansh import repairs 2026-09-13 03:04:40 +03:00
Lauri Ojansivu d7cef406f6 Repair Romansh import and remaining search instructions
Replace fifteen mixed-language findings while preserving JSON examples, endpoints, import counts and search tokens. Wording remains subject to native-speaker review.
2026-09-13 03:04:31 +03:00
Lauri Ojansivu 16c10b2ad3 Refresh audit after Romansh search instruction repairs 2026-09-13 03:04:03 +03:00
Lauri Ojansivu e619a16b8b Repair Romansh search operator instructions
Replace twelve mixed-language findings and restore the days-ago-or-less meaning for created and modified searches. Preserve operator tokens, argument examples and optional server key-file instructions. Wording remains subject to native-speaker review.
2026-09-13 03:03:54 +03:00
Lauri Ojansivu 32a22e2e1a Refresh short translation audit after Romansh export repairs 2026-09-13 03:03:26 +03:00
Lauri Ojansivu 1c58ba6450 Repair Romansh export storage and filter wording
Replace fifteen mixed-language findings, preserving date categories, export constraints and technical identifiers. Wording remains subject to native-speaker review.
2026-09-13 03:03:18 +03:00
Lauri Ojansivu af66ddb54d Update concise audit after Romansh account error repairs 2026-09-13 03:02:52 +03:00
Lauri Ojansivu 31a290e2ef Repair Romansh account errors and zoom prompt
Replace ten mixed-language findings while preserving JSON and zoom-range instructions. Romansh wording remains subject to native-speaker review.
2026-09-13 03:02:43 +03:00
Lauri Ojansivu 665504f7b5 Refresh concise translation audit progress summary 2026-09-13 03:02:20 +03:00
Lauri Ojansivu 59680da9dd Repair Romansh verification body and display controls
Translate three mixed-language findings, preserving verification user/URL tokens, vertical scrollbar enablement and WIP-limit enablement. Wording remains subject to native-speaker review.
2026-09-13 03:00:12 +03:00
Lauri Ojansivu d536d0156e Refresh audit after Romansh verification email repairs 2026-09-13 02:59:48 +03:00
Lauri Ojansivu ee19972742 Repair Romansh invitation and verification email wording
Translate three wrong-language findings, preserving successful email sending and site-name placeholder in the verification subject. Wording remains subject to native-speaker review.
2026-09-13 02:59:36 +03:00
Lauri Ojansivu fa7e0ba4c6 Refresh audit after Romansh enrollment repairs 2026-09-13 02:59:13 +03:00
Lauri Ojansivu 341d32d4ed Repair Romansh enrollment and email error translations
Translate four wrong-language findings, preserving enrollment user/URL tokens, email sending failures and invalid email meaning. Wording remains subject to native-speaker review.
2026-09-13 02:59:03 +03:00
Lauri Ojansivu dec43b294b Refresh audit after Romansh email labels 2026-09-13 02:58:39 +03:00
Lauri Ojansivu e73ad8d101 Repair Romansh translation editor and email labels
Translate four mixed-language findings, preserving voting end date and invitation-domain authorization when self-registration is disabled. Technical wording remains subject to native-speaker review.
2026-09-13 02:58:28 +03:00
Lauri Ojansivu 4fb6da0f76 Refresh audit after Romansh due card labels 2026-09-13 02:58:06 +03:00
Lauri Ojansivu 6b8c23f857 Repair Romansh due card view and WIP labels
Translate four mixed-language findings, preserving due-card view, due-today placeholder and WIP-limit editing meanings. Wording remains subject to native-speaker review.
2026-09-13 02:57:55 +03:00
Lauri Ojansivu b0b1e4f8ab Refresh audit after Romansh due date repairs 2026-09-13 02:57:31 +03:00
Lauri Ojansivu ea56409739 Repair Romansh due date and sidebar labels
Translate four mixed-language findings, preserving the due-date change count placeholder, empty due-card state and drag-to-resize interaction. Wording remains subject to native-speaker review.
2026-09-13 02:57:21 +03:00
Lauri Ojansivu 851d93f38e Refresh audit after Romansh action labels 2026-09-13 02:56:58 +03:00
Lauri Ojansivu 5f3d194b04 Repair Romansh action and menu resize labels
Translate four mixed-language findings, preserving watch disablement, label/member action clarification and dragging to resize the left menu. Wording remains subject to native-speaker review.
2026-09-13 02:56:47 +03:00
Lauri Ojansivu 39c9f08acf Refresh audit after Romansh storage status repairs 2026-09-13 02:56:23 +03:00
Lauri Ojansivu a69e3e2fc1 Repair Romansh storage status and avatar transfer labels
Translate four mixed-language findings, preserving save success/failure and avatar import/export disablement distinctions. Wording remains subject to native-speaker review.
2026-09-13 02:56:13 +03:00
Lauri Ojansivu c6ef7bca9b Refresh audit after Romansh default settings repairs 2026-09-13 02:55:50 +03:00
Lauri Ojansivu 7024662807 Repair Romansh default authentication and storage labels
Translate three mixed-language findings, preserving default authentication method and the storage destination for newly uploaded attachments. Wording remains subject to native-speaker review.
2026-09-13 02:55:39 +03:00
Lauri Ojansivu c897779e32 Refresh audit after Romansh database labels 2026-09-13 02:55:16 +03:00
Lauri Ojansivu e6d5afa6a7 Repair Romansh database migration labels
Translate four mixed-language findings, preserving text-data scope, database destinations and version names, migration completion and custom web manifest enablement. Technical wording remains subject to native-speaker review.
2026-09-13 02:55:06 +03:00
Lauri Ojansivu 66bdadb594 Refresh audit after Romansh custom HTML repairs 2026-09-13 02:54:44 +03:00
Lauri Ojansivu 2feabc2678 Repair Romansh custom HTML and help labels
Translate five mixed-language findings, preserving Enter key, HTML link/meta/head identifiers and custom help URL meaning. Technical terminology remains subject to native-speaker review.
2026-09-13 02:54:33 +03:00
Lauri Ojansivu e16e145c92 Refresh audit after Romansh configuration repairs 2026-09-13 02:54:10 +03:00
Lauri Ojansivu d3f0bb04bf Repair Romansh custom configuration instructions
Translate five mixed-language findings, preserving migration retry scope, assetlinks.json filename, JSON acronym, Enter key and exact template placeholder. Technical terminology remains subject to native-speaker review.
2026-09-13 02:53:59 +03:00
Lauri Ojansivu 29e42a6d1e Refresh audit after Romansh migration state repairs 2026-09-13 02:53:34 +03:00
Lauri Ojansivu 009a1e9c26 Repair Romansh migration status translations
Translate five mixed-language findings, preserving retry versus resume behavior and failed versus paused migration states. Wording remains subject to native-speaker review.
2026-09-13 02:53:24 +03:00
Lauri Ojansivu c4c63ac429 Refresh audit after Romansh job status repairs 2026-09-13 02:52:59 +03:00
Lauri Ojansivu 58ec2cf8d6 Repair Romansh scheduled job status messages
Translate five mixed-language findings, preserving paused, resumed and started states and distinguishing failures from successful actions. Wording remains subject to native-speaker review.
2026-09-13 02:52:48 +03:00
Lauri Ojansivu b4bfaef47d Refresh audit after Romansh sorting repairs 2026-09-13 02:52:25 +03:00
Lauri Ojansivu bd68e11285 Repair Romansh sort and scheduled job labels
Translate five wrong-language findings, preserving newest/oldest order, cover-image meaning, error clearing and scheduled-job pause failure. Wording remains subject to native-speaker review.
2026-09-13 02:52:14 +03:00
Lauri Ojansivu 56d9268eb4 Refresh audit after Romansh clipboard repairs 2026-09-13 02:51:41 +03:00
Lauri Ojansivu 6962c174ed Repair Romansh clipboard and checklist labels
Translate five wrong-language findings, preserving comment-only permission, checklist deletion confirmation and link/text/template copying distinctions. Wording remains subject to native-speaker review.
2026-09-13 02:51:29 +03:00
Lauri Ojansivu 1afd762bc6 Refresh audit after Romansh comment repairs 2026-09-13 02:51:05 +03:00
Lauri Ojansivu 985a8f2351 Repair Romansh comment permissions and dialog wording
Translate five wrong-language findings, preserving blank-to-keep secret behavior, assigned-card visibility, comment-only permission and comment search placeholder. Wording remains subject to native-speaker review.
2026-09-13 02:50:55 +03:00
Lauri Ojansivu badb9c6930 Refresh audit after Romansh loading and star repairs 2026-09-13 02:50:30 +03:00
Lauri Ojansivu 68a57cd852 Repair Romansh loading and page star labels
Translate five mixed-language findings, preserving visible-card loading, checklist count notation, old-job cleanup and opposite page star actions. Wording remains subject to native-speaker review.
2026-09-13 02:50:20 +03:00
Lauri Ojansivu d08e70985e Refresh audit after Romansh card state repairs 2026-09-13 02:49:58 +03:00
Lauri Ojansivu 1612bb422b Repair Romansh card state and aging labels
Translate six mixed-language findings, preserving fading rather than deletion, three aging tiers, custom-field editing and complete/incomplete distinctions. Wording remains subject to native-speaker review.
2026-09-13 02:49:47 +03:00
Lauri Ojansivu 3412e9cbb6 Refresh audit after Romansh time summary repairs 2026-09-13 02:49:24 +03:00
Lauri Ojansivu 18f5dab0c6 Repair Romansh time summary and file count labels
Translate five mixed-language findings, preserving time-spent summary, background-image change and ongoing file-count calculation meanings. Wording remains subject to native-speaker review.
2026-09-13 02:49:12 +03:00
Lauri Ojansivu 383b725b3a Refresh audit after Romansh background repairs 2026-09-13 02:48:48 +03:00
Lauri Ojansivu 2d36116131 Repair Romansh background and backup labels
Translate five wrong-language findings, preserving the size template token, backup-selection prerequisite and attachment-count meaning. Wording remains subject to native-speaker review.
2026-09-13 02:48:37 +03:00
Lauri Ojansivu 9a38d660bf Refresh audit after Romansh avatar and Azure repairs 2026-09-13 02:48:15 +03:00
Lauri Ojansivu 503dd899f1 Repair Romansh avatar and Azure instructions
Translate five mixed-language findings, preserve avatar size placeholder and restore exact Azure menu labels while translating user-specific prose. Wording remains subject to native-speaker review.
2026-09-13 02:48:04 +03:00
Lauri Ojansivu b25ae1d336 Refresh audit after Romansh transfer limit repairs 2026-09-13 02:47:42 +03:00
Lauri Ojansivu 86cece2ae2 Repair Romansh transfer limit and URL instructions
Translate five wrong-language findings, preserving positive-limit validation, save success/failure distinction, storage path meaning and one URL scheme per line. Wording remains subject to native-speaker review.
2026-09-13 02:47:32 +03:00
Lauri Ojansivu c6bd660135 Refresh audit after Romansh attachment repairs 2026-09-13 02:47:10 +03:00
Lauri Ojansivu f94194b24b Repair Romansh attachment and API translations
Translate six mixed-language findings, preserving storage product names, attachment move destinations and the exact WITH_API=true condition. Wording remains subject to native-speaker review.
2026-09-13 02:47:01 +03:00
Lauri Ojansivu 926d1021be Refresh audit after Romansh upload label repairs 2026-09-13 02:46:38 +03:00
Lauri Ojansivu 7752edff8d Repair Romansh upload and anonymization labels
Translate eight mixed-language findings, preserving logged-in user scope, avatar/upload file types and account versus export anonymization distinctions. Wording remains subject to native-speaker review.
2026-09-13 02:46:27 +03:00
Lauri Ojansivu 032298f05a Refresh audit after Romansh custom field repairs 2026-09-13 02:46:04 +03:00
Lauri Ojansivu c730a428f1 Repair Romansh custom field and administration wording
Translate eight wrong-language findings, preserving custom field placeholders, the literal closing body tag and active system-wide announcement meaning. Wording remains subject to native-speaker review.
2026-09-13 02:45:55 +03:00
Lauri Ojansivu 38ae75c1b1 Refresh audit after Romansh card activity repairs 2026-09-13 02:45:32 +03:00
Lauri Ojansivu 56d013e6e0 Repair Romansh card activity translations
Translate eight Italian or mixed-language activity messages, preserving positional placeholders and checklist completion, date changes, movement and label removal meanings. Wording remains subject to native-speaker review.
2026-09-13 02:45:22 +03:00
Lauri Ojansivu c12bbd97e3 Refresh audit after Romansh date activity repairs 2026-09-13 02:44:58 +03:00
Lauri Ojansivu 34fdd95670 Repair Romansh date activity and scheduled job messages
Translate eight mixed-language findings, preserving date-change placeholders, approaching/current/past due distinctions and scheduled job meaning. Wording remains subject to native-speaker review.
2026-09-13 02:44:48 +03:00
Lauri Ojansivu 376fa877a2 Refresh audit after Romansh lockout repairs 2026-09-13 02:44:25 +03:00
Lauri Ojansivu 7530b4e9cf Repair Romansh account lockout translations
Replace twelve mixed-language values with Romansh, preserving temporary lockout causes, user unlock scopes, seconds units and due-time placeholders. Wording remains subject to native-speaker review.
2026-09-13 02:44:14 +03:00
Lauri Ojansivu 25e4774c7d Refresh audit after Romansh runtime and account repairs 2026-09-13 02:43:47 +03:00
Lauri Ojansivu 640bb8a742 Repair Romansh runtime and account wording
Replace fifteen Italian or mixed-language findings with Romansh. Preserve runtime metrics, spinner names, time-change meanings and account success/failure distinction. Technical wording remains subject to native-speaker review.
2026-09-13 02:43:37 +03:00
Lauri Ojansivu a1aaae727b Refresh audit after Romansh translation repairs 2026-09-13 02:43:13 +03:00
Lauri Ojansivu e27ff872c6 Repair Romansh activity and runtime labels
Replace twelve Italian or mixed-language labels with Romansh, preserving activity placeholders, spinner names, DDP_TRANSPORT and malloc identifiers. Runtime terminology is low confidence and requires native-speaker review.
2026-09-13 02:43:03 +03:00
Lauri Ojansivu b633e2a1a2 Refresh translation audit after Igbo repairs 2026-09-13 02:42:31 +03:00
Lauri Ojansivu 1231da296f Repair Igbo filter instructions and CPU label
Translate the two flagged English values, preserving CPU and OS acronyms plus filter operators and literal examples. Technical wording is low confidence and requires native-speaker review.
2026-09-13 02:42:21 +03:00
Lauri Ojansivu 87741e0736 Refresh translation audit after Maori repairs 2026-09-13 02:41:54 +03:00
Lauri Ojansivu f51f0072b3 Repair Maori calendar labels
Translate three English calendar labels using existing Maramataka terminology. Preserve national, moon observation and astronomical epoch distinctions. Technical wording is low confidence and requires native-speaker review.
2026-09-13 02:41:44 +03:00
Lauri Ojansivu e260f50ba1 Refresh translation audit after Maltese repairs 2026-09-13 02:41:25 +03:00
Lauri Ojansivu 106abeb2c8 Repair Maltese calendar labels
Translate ten flagged labels using existing Kalendarju terminology, correct Persian identification, and preserve calendar identities, sighting and epoch distinctions. Technical wording remains subject to native-speaker review.
2026-09-13 02:41:14 +03:00
Lauri Ojansivu 9929df8539 Refresh audit after Luxembourgish translation review 2026-09-13 02:40:51 +03:00
Lauri Ojansivu 18cde68eb4 Repair Luxembourgish calendar and WIP labels
Translate five English calendar labels and soft WIP wording. Retain the valid SMTP Test-E-Mail subject after contextual review. Technical calendar wording remains subject to native-speaker review.
2026-09-13 02:40:41 +03:00
Lauri Ojansivu 4f2d00054d Refresh translation audit after Uzbek repairs 2026-09-13 02:40:17 +03:00
Lauri Ojansivu c8b7e7344b Repair Uzbek calendar labels
Translate eight English labels across four Uzbek locales using their existing Latin-script terminology. Preserve Indian national and Saudi moon-sighting meanings.
2026-09-13 02:40:06 +03:00
Lauri Ojansivu 397cddef67 Refresh translation audit after Sindhi repair 2026-09-13 02:39:44 +03:00
Lauri Ojansivu 1da2bfcfc4 Repair Sindhi Saudi Hijri calendar label
Translate the English label using existing Sindhi calendar terminology and preserve moon sighting. Wording remains subject to native-speaker review.
2026-09-13 02:39:34 +03:00
Lauri Ojansivu d3bb0bfe08 Refresh translation audit after Burmese repairs 2026-09-13 02:39:14 +03:00
Lauri Ojansivu c558a8f485 Repair Burmese Hijri calendar labels
Translate Saudi sighting and tabular astronomical-epoch labels using existing Burmese calendar terminology. Technical epoch phrasing is low confidence and requires native-speaker review.
2026-09-13 02:39:02 +03:00
Lauri Ojansivu 76cdf3907b Refresh translation audit after Assamese repairs 2026-09-13 02:38:43 +03:00
Lauri Ojansivu d0c367310e Repair Assamese Hijri calendar labels
Translate Saudi moon-sighting and tabular astronomical-epoch labels using existing Assamese calendar terminology. Epoch phrasing is low confidence and requires native-speaker review.
2026-09-13 02:38:34 +03:00
Lauri Ojansivu be1cdd53be Refresh translation audit after Sinhala repairs 2026-09-13 02:38:16 +03:00
Lauri Ojansivu 775cd7f8f8 Repair Sinhala calendar labels
Translate three English labels and correct the adjacent civil-epoch label which incorrectly referred to an epic poem. Preserve calendar method and epoch distinctions. Technical wording is low confidence and requires native-speaker review.
2026-09-13 02:38:05 +03:00
Lauri Ojansivu 68133adba5 Refresh translation audit after Pashto repairs 2026-09-13 02:37:44 +03:00
Lauri Ojansivu 2ee492d031 Repair Pashto calendar labels
Translate Indian national and Saudi Hijri calendar labels using existing Pashto terminology and retain moon sighting. Wording remains subject to native-speaker review.
2026-09-13 02:37:34 +03:00
Lauri Ojansivu eb12ba31f5 Refresh translation audit after Amharic repairs 2026-09-13 02:37:16 +03:00
Lauri Ojansivu 2f5954fd68 Repair Amharic Hijri calendar labels
Translate the Saudi sighting and tabular astronomical-epoch labels using existing Amharic calendar terminology. Technical epoch wording is low confidence and requires native-speaker review.
2026-09-13 02:37:05 +03:00
Lauri Ojansivu af28210aa4 Refresh audit after Upper Sorbian repairs 2026-09-13 02:36:44 +03:00
Lauri Ojansivu f55b741d8e Repair Upper Sorbian calendar labels
Translate three English calendar labels using existing protyka terminology and retain national, moon observation and astronomical epoch distinctions. Technical wording is low confidence and requires native-speaker review.
2026-09-13 02:36:33 +03:00
Lauri Ojansivu 1cacdcccb3 Refresh translation audit after Zulu repairs 2026-09-13 02:36:12 +03:00
Lauri Ojansivu 5b7dd246a4 Repair Zulu Hijri calendar labels
Translate English labels and adjacent civil-epoch wording in both Zulu locales, preserving moon observation and astronomical distinction. Remove duplicate closing parentheses in Umm al-Qura labels. Epoch phrasing is low confidence and requires native-speaker review.
2026-09-13 02:36:02 +03:00
Lauri Ojansivu 662306eea0 Refresh translation audit after Somali repair 2026-09-13 02:35:38 +03:00
Lauri Ojansivu 679834c2ef Repair Somali Saudi Hijri calendar label
Replace the English label using existing Somali calendar terminology and preserve moon sighting as the method. Wording remains subject to native-speaker review.
2026-09-13 02:35:28 +03:00
Lauri Ojansivu f16d6ea390 Refresh translation audit after Sicilian repairs 2026-09-13 02:35:11 +03:00
Lauri Ojansivu 36ddb49916 Repair Sicilian calendar labels
Translate three English calendar labels using existing Calannariu terminology, retaining Indian national, Saudi moon sighting and tabular astronomical epoch meanings. Wording requires native-speaker review.
2026-09-13 02:35:00 +03:00
Lauri Ojansivu 282ba0e45b Refresh translation audit after Faroese repairs 2026-09-13 02:34:38 +03:00
Lauri Ojansivu 85825b65a9 Repair Faroese calendar labels
Translate three English calendar labels while retaining Indian national, Saudi moon observation and tabular astronomical epoch meanings. Technical wording is low confidence and requires native-speaker review.
2026-09-13 02:34:29 +03:00
Lauri Ojansivu 07aac681c8 Refresh translation audit after Serbian repair 2026-09-13 02:34:05 +03:00
Lauri Ojansivu ec3a82e4e7 Repair Serbian Saudi Hijri calendar label
Replace the English label with Serbian wording and preserve observation of the young moon as the calendar method.
2026-09-13 02:33:55 +03:00
Lauri Ojansivu 5c5c390c0a Refresh audit after Haitian Creole repairs 2026-09-13 02:33:35 +03:00
Lauri Ojansivu 041841f41e Repair Haitian Creole Hijri calendar labels
Translate the English Saudi label and four adjacent French Hijri labels into Haitian Creole. Preserve calendar methods and distinct epochs. Epoch wording is low confidence and requires native-speaker review.
2026-09-13 02:33:25 +03:00
Lauri Ojansivu e08df5bdbf Refresh translation audit after Hausa repairs 2026-09-13 02:33:03 +03:00
Lauri Ojansivu 8a883cbc08 Repair Hausa calendar labels
Translate the flagged Indian national and Saudi moon-sighting labels, plus adjacent English civil and astronomical epoch wording. Technical epoch phrasing is low confidence and requires native-speaker review.
2026-09-13 02:32:53 +03:00
Lauri Ojansivu 231e64a4f2 Refresh translation audit after Punjabi review 2026-09-13 02:32:30 +03:00
Lauri Ojansivu e7f8262c55 Repair Punjabi advanced filter instructions
Translate English filter instructions while preserving operators and literal examples. Retain two cloud product names with valid danda punctuation after review. Technical wording requires native-speaker review.
2026-09-13 02:32:20 +03:00
Lauri Ojansivu 2543b3c979 Refresh translation audit after Javanese repairs 2026-09-13 02:31:48 +03:00
Lauri Ojansivu f8c7aee29c Repair Javanese calendar labels
Translate the Indian national and Saudi Hijri labels using existing tanggalan terminology and retain observation of the moon. Wording remains subject to native-speaker review.
2026-09-13 02:31:39 +03:00
Lauri Ojansivu 72df46ee3a Refresh translation audit after Filipino repairs 2026-09-13 02:31:22 +03:00
Lauri Ojansivu a9b2337f78 Repair Filipino calendar labels
Translate fifteen English labels using the existing kalendaryo terminology, preserving calendar names, moon sighting and distinct civil and astronomical epochs. Technical wording requires native-speaker review.
2026-09-13 02:31:12 +03:00
Lauri Ojansivu fbed7e48dc Refresh audit after Kyrgyz and Tajik repairs 2026-09-13 02:30:49 +03:00
Lauri Ojansivu 04b3941431 Repair Kyrgyz and Tajik calendar labels
Translate sixteen English calendar labels using existing locale calendar terminology, retaining named eras and moon-sighting methods. Low-confidence technical calendar wording requires native-speaker review.
2026-09-13 02:30:39 +03:00
Lauri Ojansivu 70daae73b2 Refresh translation audit after Marathi and Nepali repairs 2026-09-13 02:30:10 +03:00
Lauri Ojansivu 32eb90ec9f Repair Marathi and Nepali Hijri calendar labels
Replace English labels while retaining Saudi moon sighting and the tabular astronomical epoch. Technical calendar wording remains subject to native-speaker review.
2026-09-13 02:30:00 +03:00
Lauri Ojansivu 7992431272 Refresh audit after Chinese translation reviews 2026-09-13 02:29:38 +03:00
Lauri Ojansivu 97ce8878fe Repair Chinese Saudi Hijri labels and review product names
Translate five English calendar labels with explicit Saudi Arabia and crescent observation. Retain thirteen official cloud product names with valid Chinese punctuation.
2026-09-13 02:29:28 +03:00
Lauri Ojansivu cb311d2031 Refresh audit after Thai and Japanese reviews 2026-09-13 02:28:58 +03:00
Lauri Ojansivu ac2ec5fbe6 Repair Thai and Japanese calendar variant labels
Translate Saudi moon-sighting and tabular astronomical-epoch labels. Retain six Japanese cloud product names with valid punctuation after review. Technical calendar wording remains subject to native-speaker review.
2026-09-13 02:28:48 +03:00
Lauri Ojansivu 7d335726e4 Refresh translation audit after Turkmen repairs 2026-09-13 02:28:13 +03:00
Lauri Ojansivu 7e97cd1ddb Repair Turkmen calendar labels
Translate the Indian national and Saudi Hijri calendar labels using existing Turkmen calendar terminology. Preserve the moon-sighting distinction; technical wording remains subject to native-speaker review.
2026-09-13 02:28:04 +03:00
Lauri Ojansivu fbb0e6fc31 Refresh translation audit after Vietnamese repairs 2026-09-13 02:27:43 +03:00
Lauri Ojansivu 889a4dadb2 Repair Vietnamese Hijri calendar variant labels
Replace English labels in both Vietnamese locales and retain moon sighting and the astronomical epoch distinction.
2026-09-13 02:27:33 +03:00
Lauri Ojansivu a208398028 Refresh translation audit after Urdu repair 2026-09-13 02:27:11 +03:00
Lauri Ojansivu 8f49a49c9a Repair Urdu Saudi Hijri calendar label
Translate the remaining English label and preserve the moon-sighting method of the Saudi calendar variant.
2026-09-13 02:27:01 +03:00
Lauri Ojansivu 93d395b2a6 Shorten translation audit progress summary 2026-09-13 02:26:39 +03:00
Lauri Ojansivu abae253d7f Record Tamil translation repair progress 2026-09-13 02:24:20 +03:00
Lauri Ojansivu 4ceab106bb Repair Tamil Saudi Hijri calendar label
Preserve Saudi Arabia and crescent-sighting distinction.
2026-09-13 02:24:00 +03:00
Lauri Ojansivu c50bc96d6e Record Kannada translation repair progress 2026-09-13 02:23:32 +03:00
Lauri Ojansivu fa4eec25b8 Repair Kannada tabular Hijri calendar label
Preserve tabular calculation and astronomical epoch distinctions. Kannada technical wording needs native-speaker review.
2026-09-13 02:23:16 +03:00
Lauri Ojansivu c8f3c1fa85 Record Gujarati translation repair progress 2026-09-13 02:22:45 +03:00
Lauri Ojansivu acae5051ed Translate Gujarati advanced-filter instructions
Preserve operators, quoted values, escaping, evaluation order and regex examples. Gujarati technical wording needs native-speaker review.
2026-09-13 02:22:27 +03:00
Lauri Ojansivu b468f23a42 Record Hindi translation repair progress 2026-09-13 02:21:54 +03:00
Lauri Ojansivu 1fd5131fc0 Repair Hindi calendar variants and review vendor names
Preserve Saudi lunar observation and tabular astronomical epoch; retain product names with valid Hindi punctuation. Hindi technical wording needs native-speaker review.
2026-09-13 02:21:36 +03:00
Lauri Ojansivu 162ffef58f Record completion of flagged Armenian translation queue 2026-09-13 02:21:05 +03:00
Lauri Ojansivu 8ad44478c5 Translate Armenian advanced-filter instructions
Preserve operators, quoted values, escaping, evaluation order and regex examples. Armenian technical wording needs native-speaker review.
2026-09-13 02:20:48 +03:00
Lauri Ojansivu 1c48c0256d Record Armenian translation repair progress 2026-09-13 02:20:22 +03:00
Lauri Ojansivu 25263ead6c Repair Armenian mail-copy and calendar labels
Preserve cloud-storage product names and calendar variant distinctions. Armenian technical wording needs native-speaker review.
2026-09-13 02:20:07 +03:00
Lauri Ojansivu b3557bc805 Record Georgian translation repair progress 2026-09-13 02:19:39 +03:00
Lauri Ojansivu 308b7b3897 Repair Georgian Hijri calendar variant labels
Preserve Saudi lunar observation and tabular astronomical epoch distinctions. Georgian technical wording needs native-speaker review.
2026-09-13 02:19:23 +03:00
Lauri Ojansivu 8f3256e487 Record completion of flagged Welsh translation queues 2026-09-13 02:18:58 +03:00
Lauri Ojansivu c0000ea3c3 Translate Welsh advanced-filter instructions
Preserve operators, quoted values, escaping, evaluation order and regex examples in both Welsh locales. Welsh technical wording needs native-speaker review.
2026-09-13 02:18:41 +03:00
Lauri Ojansivu c4c6d6ab72 Record Welsh calendar translation repair progress 2026-09-13 02:18:15 +03:00
Lauri Ojansivu aabc123eed Repair Welsh Hijri calendar variant labels
Preserve Saudi lunar observation and tabular astronomical epoch distinctions in both Welsh locales. Welsh technical wording needs native-speaker review.
2026-09-13 02:18:02 +03:00
Lauri Ojansivu 36f783a5bd Record Swahili translation repair progress 2026-09-13 02:17:27 +03:00
Lauri Ojansivu 656257ca73 Repair Swahili Hijri calendar variant labels
Preserve Saudi lunar sighting and tabular astronomical epoch distinctions. Swahili technical wording needs native-speaker review.
2026-09-13 02:17:07 +03:00
Lauri Ojansivu 9c66ac85d1 Record Irish translation repair progress 2026-09-13 02:16:40 +03:00
Lauri Ojansivu c65c83eba1 Repair Irish Hijri calendar variant labels
Preserve Saudi lunar observation and tabular astronomical epoch distinctions. Irish technical wording needs native-speaker review.
2026-09-13 02:16:23 +03:00
Lauri Ojansivu e7d92a4832 Record Azerbaijani translation repair progress 2026-09-13 02:15:58 +03:00
Lauri Ojansivu c226b0b4a1 Repair Azerbaijani filter help and Hijri observation label
Preserve operators, quoting, escaping and regex examples across all three locales; retain Saudi lunar-observation distinction. Azerbaijani technical wording needs native-speaker review.
2026-09-13 02:15:36 +03:00
Lauri Ojansivu bd04435674 Record Icelandic translation repair progress 2026-09-13 02:14:56 +03:00
Lauri Ojansivu 2b2d7c745d Repair Icelandic Hijri calendar variant labels
Preserve Saudi lunar observation and tabular astronomical epoch distinctions. Icelandic technical wording needs native-speaker review.
2026-09-13 02:14:40 +03:00
Lauri Ojansivu 96017ceb55 Record Belarusian translation repair progress 2026-09-13 02:14:13 +03:00
Lauri Ojansivu 77337d40e6 Repair Belarusian calendar-system labels
Preserve Indian national-calendar scope, Saudi lunar observation and tabular astronomical epoch distinctions.
2026-09-13 02:13:56 +03:00
Lauri Ojansivu 6cad5f1072 Record Malay translation repair progress 2026-09-13 02:13:30 +03:00
Lauri Ojansivu 85e32bb48f Translate Malay advanced-filter instructions
Preserve operators, quoted values, escaping, evaluation order and regex examples in both Malay locales.
2026-09-13 02:13:15 +03:00
Lauri Ojansivu c79b95219d Record Indonesian translation repair progress 2026-09-13 02:12:46 +03:00
Lauri Ojansivu e28225f7fe Translate Indonesian advanced-filter instructions
Preserve comparison and Boolean operators, quoted values, escape sequences, evaluation order and regex examples.
2026-09-13 02:12:31 +03:00
Lauri Ojansivu 5d8a2be1bc Record Esperanto translation repair progress 2026-09-13 02:12:04 +03:00
Lauri Ojansivu 5566125502 Repair Esperanto calendar-system labels
Preserve Indian national-calendar scope, Saudi lunar observation and tabular astronomical epoch distinctions.
2026-09-13 02:11:48 +03:00
Lauri Ojansivu 5e5db9734b Record Catalan translation repair progress 2026-09-13 02:11:23 +03:00
Lauri Ojansivu 1a8e81180f Repair Catalan Hijri calendar variant labels
Preserve Saudi lunar observation and tabular astronomical epoch distinctions across all three Catalan locales.
2026-09-13 02:11:06 +03:00
Lauri Ojansivu 801a358163 Record Afrikaans translation repair progress 2026-09-13 02:10:35 +03:00
Lauri Ojansivu 0b334f2b21 Repair Afrikaans Hijri calendar variant labels
Preserve Saudi lunar observation and tabular astronomical epoch distinctions in both Afrikaans locales.
2026-09-13 02:10:19 +03:00
Lauri Ojansivu f8aa8bc0e3 Record Korean translation repair progress 2026-09-13 02:09:54 +03:00
Lauri Ojansivu 9ee66fee4b Repair Korean advanced-filter help and calendar variants
Preserve operators, escaped characters and regex examples in both Korean locales; distinguish Saudi lunar observation from tabular astronomical epoch.
2026-09-13 02:09:35 +03:00
Lauri Ojansivu eb1b1dfe59 Record Bulgarian translation repair progress 2026-09-13 02:09:02 +03:00
Lauri Ojansivu 462f5f5a98 Repair Bulgarian advanced-filter help and calendar variants
Translate filter instructions while preserving operators, escaping and regex examples; distinguish Saudi lunar sighting and astronomical epoch.
2026-09-13 02:08:48 +03:00
Lauri Ojansivu 0960e4981b Record completion of flagged Tok Pisin translation queue 2026-09-13 02:08:19 +03:00
Lauri Ojansivu 94eecaccb8 Repair remaining flagged Tok Pisin calendar and appearance labels
Preserve tabular epoch distinctions, lunar sighting and named calendar systems. Tok Pisin technical calendar terminology needs native-speaker review.
2026-09-13 02:08:04 +03:00
Lauri Ojansivu 2ede2464fb Update translation audit progress for Tok Pisin calendar labels 2026-09-13 02:07:35 +03:00
Lauri Ojansivu cfcbd0340f Translate Tok Pisin calendar-system labels
Preserve Dangi, Amete Alem and Hijri system names and national calendar distinctions. Tok Pisin wording needs native-speaker review.
2026-09-13 02:07:21 +03:00
Lauri Ojansivu e671003169 Update translation audit progress for Tok Pisin repairs 2026-09-13 02:06:57 +03:00
Lauri Ojansivu 9058adbdab Repair Tok Pisin custom-link and calendar labels
Preserve URL labels and distinguish help, login logo and top-left logo links. Tok Pisin wording needs native-speaker review.
2026-09-13 02:06:43 +03:00
Lauri Ojansivu e47e4611ac Record completion of flagged Friulian translation queue 2026-09-13 02:06:12 +03:00
Lauri Ojansivu b3966ceac6 Finish flagged Friulian interface-label review
Translate filesystem, pause, completion and team labels; preserve literal search operators and reviewed shared terminology. Friulian wording needs native-speaker review.
2026-09-13 02:05:57 +03:00
Lauri Ojansivu 6d95c42c91 Update translation audit progress for Friulian shared-term review 2026-09-13 02:05:25 +03:00
Lauri Ojansivu 2d092cc5b2 Review Friulian shared terms and repair pause action
Retain reviewed avatar, file, version and Europe labels; make the pause button an explicit action. Friulian wording needs native-speaker review.
2026-09-13 02:05:11 +03:00
Lauri Ojansivu 83ca259922 Update translation audit progress for Friulian Hijri variants 2026-09-13 02:04:43 +03:00
Lauri Ojansivu 0dcd3ea5af Repair Friulian Hijri calendar variant labels
Preserve civil and astronomical epochs, Saudi observation and Umm al-Qura; retain reviewed shared limits and avatar terms. Friulian wording needs native-speaker review.
2026-09-13 02:04:29 +03:00
Lauri Ojansivu 74f7479fa2 Update translation audit progress for Friulian calendar repairs 2026-09-13 02:04:00 +03:00
Lauri Ojansivu 9a209e7e5d Repair flagged Friulian calendar names
Follow existing calendari terminology, preserve Dangi and Amete Alem distinctions, and identify Jalali as Persian. Friulian wording needs native-speaker review.
2026-09-13 02:03:45 +03:00
Lauri Ojansivu aa3b709e15 Record completion of flagged Aragonese translation queue 2026-09-13 02:03:06 +03:00
Lauri Ojansivu a188ed9842 Translate remaining flagged Aragonese calendar names
Preserve civil and astronomical epochs, Saudi observation, Umm al-Qura and Amete Alem distinctions. Aragonese wording needs native-speaker review.
2026-09-13 02:02:52 +03:00
Lauri Ojansivu 17da898c20 Update translation audit progress for import and calendar repairs 2026-09-13 02:02:19 +03:00
Lauri Ojansivu f2a14c375d Repair Aragonese import results and calendar label
Preserve repository upload/update alternatives and version-check failure; retain valid writable-path wording. Aragonese wording needs native-speaker review.
2026-09-13 02:02:00 +03:00
Lauri Ojansivu b579211a45 Update translation audit progress for Trello-import repairs 2026-09-13 02:01:30 +03:00
Lauri Ojansivu d4cdeede33 Repair Aragonese team, theme and Trello import labels
Preserve missing-team token, default theme behavior and requirement for both API key and token with token generation location. Aragonese wording needs native-speaker review.
2026-09-13 02:01:17 +03:00
Lauri Ojansivu 3e778d4795 Update translation audit progress for editor and lane repairs 2026-09-13 02:00:50 +03:00
Lauri Ojansivu 0ae193a172 Repair Aragonese attachment, editor and lane messages
Preserve URL and Enter literals, positive integer height requirement and missing-lane placeholder; retain valid full-path subtext label. Aragonese wording needs native-speaker review.
2026-09-13 02:00:37 +03:00
Lauri Ojansivu 8d6786c0b5 Update translation audit progress for ordering-control repairs 2026-09-13 02:00:07 +03:00
Lauri Ojansivu 0bd9909d04 Repair Aragonese field labels and ordering controls
Preserve singular field-label scope, drag ordering and week-start setting; retain reviewed list migration labels. Aragonese wording needs native-speaker review.
2026-09-13 01:59:54 +03:00
Lauri Ojansivu 6fa8aab326 Update translation audit progress for minicard display repairs 2026-09-13 01:59:24 +03:00
Lauri Ojansivu 41ee5e7d07 Repair Aragonese search and minicard display settings
Preserve sidebar toggle and distinguish list, parent card, subtasks and checklist display controls. Aragonese wording needs native-speaker review.
2026-09-13 01:59:12 +03:00
Lauri Ojansivu 19275d5be8 Update translation audit progress for search and SMTP-test repairs 2026-09-13 01:58:44 +03:00
Lauri Ojansivu 45a3d13cd4 Repair Aragonese search, SMTP test and width labels
Preserve required S3 secret key, Enter-key instruction and test-email recipient; retain valid height and selection-color labels. Aragonese wording needs native-speaker review.
2026-09-13 01:58:31 +03:00
Lauri Ojansivu 30a688acb6 Update translation audit progress for S3 credential repairs 2026-09-13 01:58:01 +03:00
Lauri Ojansivu 87bab5a55c Repair Aragonese S3 storage and credential wording
Preserve provider names and AWS navigation labels; distinguish secret and access keys and retain valid region and path-style labels. Aragonese wording needs native-speaker review.
2026-09-13 01:57:48 +03:00
Lauri Ojansivu b0130d272c Update translation audit progress for restoration and S3 repairs 2026-09-13 01:57:17 +03:00
Lauri Ojansivu dbb2ad8d84 Repair Aragonese restoration, positioning and S3 wording
Preserve restore counters, right-of-selected-list meaning and literal AWS navigation labels; retain reviewed rule import/export label. Aragonese wording needs native-speaker review.
2026-09-13 01:57:06 +03:00
Lauri Ojansivu 8d3f19ac23 Update translation audit progress for workflow and archive repairs 2026-09-13 01:56:34 +03:00
Lauri Ojansivu cfe427bbd9 Repair Aragonese workflow, cover and archive labels
Preserve composable checklist conditions, minicard cover removal and restore-all scope; retain valid monitoring refresh label. Aragonese wording needs native-speaker review.
2026-09-13 01:56:22 +03:00
Lauri Ojansivu d81d4a360a Update translation audit progress for automation-trigger repairs 2026-09-13 01:55:51 +03:00
Lauri Ojansivu eb5c2f8e1f Repair Aragonese checklist and label automation triggers
Preserve Monday-through-Friday schedule and distinguish any-label addition from removal and checklist from checklist-item conditions. Aragonese wording needs native-speaker review.
2026-09-13 01:55:39 +03:00
Lauri Ojansivu 9c1df476cd Update translation audit progress for workflow automation repairs 2026-09-13 01:55:12 +03:00
Lauri Ojansivu 0e095a1db9 Repair Aragonese workflow and checklist automation wording
Preserve mapping count, case-sensitive email tags and comma-separated source example; retain valid available-tag hint. Aragonese wording needs native-speaker review.
2026-09-13 01:55:00 +03:00
Lauri Ojansivu 7901fde1a1 Update translation audit progress for PDF and width repairs 2026-09-13 01:54:28 +03:00
Lauri Ojansivu 69ca428cdb Repair Aragonese list widths and PDF fallback wording
Align push invitation with email subject and checklist terminology; retain reviewed path-prefix and trigger labels. Aragonese wording needs native-speaker review.
2026-09-13 01:54:16 +03:00
Lauri Ojansivu 77aa33ce12 Update translation audit progress for counts and overdue repairs 2026-09-13 01:53:47 +03:00
Lauri Ojansivu 9c5f760c77 Repair Aragonese counts, OTP and overdue messages
Preserve appended-count spacing, OTP acronym, due-time placeholder and image-only paste/drop restriction. Aragonese wording needs native-speaker review.
2026-09-13 01:53:36 +03:00
Lauri Ojansivu 03cf8fabf8 Update translation audit progress for operator and role repairs 2026-09-13 01:53:07 +03:00
Lauri Ojansivu a8e40cab75 Repair Aragonese operator errors and organization roles
Preserve expected-number and received-value tokens, sort/status distinctions and singular/plural administrator roles. Aragonese wording needs native-speaker review.
2026-09-13 01:52:56 +03:00
Lauri Ojansivu 9e71cfda54 Update translation audit progress for search validation repairs 2026-09-13 01:52:30 +03:00
Lauri Ojansivu e211faae04 Repair Aragonese invitation and search validation messages
Preserve pending invitation status, search predicate distinctions and positive integer limit requirement; retain valid shared-template label. Aragonese wording needs native-speaker review.
2026-09-13 01:52:17 +03:00
Lauri Ojansivu 74fada1491 Update audit progress for checklist line-conversion repairs 2026-09-13 01:51:46 +03:00
Lauri Ojansivu c52f0d3705 Repair Aragonese checklist line-conversion and selection wording
Preserve one-item-per-line and original-order instructions; retain valid new-translation label. Aragonese wording needs native-speaker review.
2026-09-13 01:51:31 +03:00
Lauri Ojansivu 15f3a2b3f0 Update translation audit progress for MongoDB and mode labels 2026-09-13 01:51:01 +03:00
Lauri Ojansivu 4076141ad9 Repair Aragonese mode, MongoDB and selection labels
Preserve MongoDB GridFS name and distinguish compact action from completion, left movement and disabling multi-selection. Aragonese wording needs native-speaker review.
2026-09-13 01:50:46 +03:00
Lauri Ojansivu c8c223de4b Update translation audit progress for migration-status repairs 2026-09-13 01:50:19 +03:00
Lauri Ojansivu 2796ffe5c5 Repair Aragonese migration status and unread labels
Preserve attachment batch limits and millisecond delay range; distinguish pausing, stopping and completed migration. Aragonese wording needs native-speaker review.
2026-09-13 01:50:07 +03:00
Lauri Ojansivu 984e602787 Update translation audit progress for list-control repairs 2026-09-13 01:49:40 +03:00
Lauri Ojansivu 3143953f5c Repair Aragonese list controls and map confirmation
Preserve selected-list position, missing-title placeholder and integer width strictly greater than 270; retain valid login permission label. Aragonese wording needs native-speaker review.
2026-09-13 01:49:28 +03:00
Lauri Ojansivu 2df569c9a5 Update translation audit progress for member and label repairs 2026-09-13 01:48:57 +03:00
Lauri Ojansivu 64afc01ce1 Repair Aragonese member, invitation and label messages
Preserve domain syntax example, unmatched-account status and label placeholders; retain valid default label. Aragonese wording needs native-speaker review.
2026-09-13 01:48:45 +03:00
Lauri Ojansivu 3d8f2de4b6 Update translation audit progress for import-prompt repairs 2026-09-13 01:48:19 +03:00
Lauri Ojansivu 7eebb0ef72 Repair Aragonese import prompts and member mapping label
Preserve JSON/SVG and JSON/ZIP alternatives and distinguish uploaded archive reading failure from general import failure. Aragonese wording needs native-speaker review.
2026-09-13 01:48:07 +03:00
Lauri Ojansivu 2a6d762509 Update translation audit progress for import-instruction repairs 2026-09-13 01:47:40 +03:00
Lauri Ojansivu 6c340f5507 Repair Aragonese import instructions and minicard labels
Preserve optional Trello attachment importer name, CSV/TSV formats and imported/unmatched counters. Aragonese wording needs native-speaker review.
2026-09-13 01:47:28 +03:00
Lauri Ojansivu bde506b296 Update translation audit progress for search and visibility repairs 2026-09-13 01:47:01 +03:00
Lauri Ojansivu 8e35e8bd32 Repair Aragonese search and checklist visibility labels
Preserve Google Cloud Storage product name and distinguish hiding checked items, finished checklists and minicard lists. Aragonese wording needs native-speaker review.
2026-09-13 01:46:49 +03:00
Lauri Ojansivu ad38bcf775 Update translation audit progress for font and storage fixes 2026-09-13 01:46:26 +03:00
Lauri Ojansivu c55646778a Repair Aragonese font and cloud-storage labels
Preserve font sample digits, service-account JSON format and literal Google Cloud navigation labels. Aragonese wording needs native-speaker review.
2026-09-13 01:46:14 +03:00
Lauri Ojansivu 28700c2825 Update translation audit progress for export-field repairs 2026-09-13 01:45:42 +03:00
Lauri Ojansivu af128180ef Repair Aragonese export fields and custom-field filters
Preserve five date categories and four people roles; retain shared export-monitoring vocabulary. Aragonese wording needs native-speaker review.
2026-09-13 01:45:30 +03:00
Lauri Ojansivu e1ebae6fed Update audit progress for Aragonese import-error repairs 2026-09-13 01:45:01 +03:00
Lauri Ojansivu 088af3ed0a Repair Aragonese import errors and checklist labels
Distinguish invalid JSON syntax from incorrect schema and preserve domain ownership and checklist expansion meaning. Aragonese wording needs native-speaker review.
2026-09-13 01:44:50 +03:00
Lauri Ojansivu 4c1bdfce83 Update translation audit progress for format-label repairs 2026-09-13 01:44:21 +03:00
Lauri Ojansivu 22d14745be Repair Aragonese email, zoom and CSV format labels
Retain valid template-variable hints and exact variable names; preserve zoom range and CSV/TSV failure meaning. Aragonese wording needs native-speaker review.
2026-09-13 01:44:10 +03:00
Lauri Ojansivu 3a2da49aee Update translation audit summary for invitation repairs 2026-09-13 01:43:40 +03:00
Lauri Ojansivu 9503b26b81 Repair Aragonese due-time and invitation wording
Preserve invitation tokens and registration-disabled condition; retain reviewed shared custom-translation vocabulary. Aragonese wording needs native-speaker review.
2026-09-13 01:43:29 +03:00
Lauri Ojansivu 0db273842e Record Aragonese repair progress and release notes 2026-09-13 01:42:55 +03:00
Lauri Ojansivu c8c6d082da Repair Aragonese import and action-choice labels
Distinguish import, export and avatar settings, label and member actions, and authentication display. Aragonese wording needs native-speaker review.
2026-09-13 01:42:37 +03:00
Lauri Ojansivu a8673bd7db Update translation repair summary for storage and export fixes 2026-09-13 01:42:07 +03:00
Lauri Ojansivu ff4a5087ae Repair Aragonese storage and export translations
Preserve storage-save confirmation, planning poker deletion and export scope. Aragonese wording needs native-speaker review.
2026-09-13 01:41:56 +03:00
Lauri Ojansivu 40f30f6671 Keep translation audit summary concise and clarify progress updates 2026-09-13 01:41:31 +03:00
Lauri Ojansivu 33a2e76e39 docs: record Aragonese database migration translation review 2026-09-13 01:39:20 +03:00
Lauri Ojansivu c01f6acde5 fix: review Aragonese database migration translations 2026-09-13 01:39:02 +03:00
Lauri Ojansivu 64946f849f docs: record Aragonese customization translation repairs 2026-09-13 01:38:28 +03:00
Lauri Ojansivu b66425851b fix: repair Aragonese customization settings labels 2026-09-13 01:38:12 +03:00
Lauri Ojansivu 85b95051c8 docs: record Aragonese migration and assetlinks translation repairs 2026-09-13 01:37:40 +03:00
Lauri Ojansivu 080a12bb59 fix: repair Aragonese migration controls and assetlinks labels 2026-09-13 01:37:21 +03:00
Lauri Ojansivu a2dded9795 docs: record Aragonese scheduled job status repairs 2026-09-13 01:36:41 +03:00
Lauri Ojansivu 982328e4ed fix: repair Aragonese scheduled job status translations 2026-09-13 01:36:23 +03:00
Lauri Ojansivu 47486c3998 docs: record Aragonese copy and creation order repairs 2026-09-13 01:35:43 +03:00
Lauri Ojansivu 803a3b73a9 fix: repair Aragonese copy actions and creation order labels 2026-09-13 01:35:21 +03:00
Lauri Ojansivu 6df3b9559b docs: record Aragonese checklist control translation repairs 2026-09-13 01:34:49 +03:00
Lauri Ojansivu fc0300f6bf fix: repair Aragonese checklist controls and comment confirmation 2026-09-13 01:34:29 +03:00
Lauri Ojansivu fd83f43b8a docs: record Aragonese minicard and calendar translation repairs 2026-09-13 01:33:53 +03:00
Lauri Ojansivu 3e13d751be fix: repair Aragonese minicard and calendar labels 2026-09-13 01:33:36 +03:00
Lauri Ojansivu 1d066ec497 docs: record Aragonese backup and attachment display repairs 2026-09-13 01:32:59 +03:00
Lauri Ojansivu 6385db4d7c fix: repair Aragonese backup and attachment display labels 2026-09-13 01:32:42 +03:00
Lauri Ojansivu e0e8e7064a docs: record Aragonese display and Azure translation repairs 2026-09-13 01:32:11 +03:00
Lauri Ojansivu 20496d28f9 fix: repair Aragonese display and Azure configuration labels 2026-09-13 01:31:53 +03:00
Lauri Ojansivu 9453dfb841 docs: record Aragonese attachment transfer translation repairs 2026-09-13 01:31:20 +03:00
Lauri Ojansivu ddc2da32ed fix: repair Aragonese attachment transfer labels 2026-09-13 01:31:04 +03:00
Lauri Ojansivu 96392764f2 docs: record Aragonese HTML placement translation repairs 2026-09-13 01:30:34 +03:00
Lauri Ojansivu 4cc1318fdd fix: repair Aragonese HTML placement and workspace translations 2026-09-13 01:30:15 +03:00
Lauri Ojansivu b0bfec0e87 Updated mirrors. 2026-09-13 01:30:06 +03:00
Lauri Ojansivu a3f3fc436f docs: record Aragonese custom field activity translation repairs 2026-09-13 01:29:44 +03:00
Lauri Ojansivu 78ee0d2e15 fix: repair Aragonese custom field and unchecked activity messages 2026-09-13 01:29:28 +03:00
Lauri Ojansivu 51203ed3ad docs: record Aragonese checklist activity translation repairs 2026-09-13 01:28:53 +03:00
Lauri Ojansivu b91faf1c68 fix: repair Aragonese checklist activity messages 2026-09-13 01:28:37 +03:00
Lauri Ojansivu 9dfe4e3b40 docs: record Aragonese scheduling translation repairs 2026-09-13 01:28:05 +03:00
Lauri Ojansivu f394a6290b fix: repair Aragonese scheduling and activity translations 2026-09-13 01:27:48 +03:00
Lauri Ojansivu b98d9b47c7 docs: record Aragonese time and accessibility translation repairs 2026-09-13 01:27:08 +03:00
Lauri Ojansivu dfc2c45d25 fix: repair Aragonese time activity and accessibility labels 2026-09-13 01:26:53 +03:00
Lauri Ojansivu 473401a83f docs: record Aragonese reactivity and memory translation review 2026-09-13 01:26:19 +03:00
Lauri Ojansivu 249249111c fix: repair Aragonese reactivity and spinner translations 2026-09-13 01:26:02 +03:00
Lauri Ojansivu 765b2070e3 docs: record Aragonese Node heap translation repairs 2026-09-13 01:25:26 +03:00
Lauri Ojansivu 72cf88d96b fix: repair Aragonese Node heap diagnostic translations 2026-09-13 01:25:10 +03:00
Lauri Ojansivu b3e26a9eee docs: record Aragonese database diagnostic translation review 2026-09-13 01:24:34 +03:00
Lauri Ojansivu 585e7df11a fix: repair Aragonese database diagnostics translations 2026-09-13 01:24:19 +03:00
Lauri Ojansivu 0623968742 docs: record Aragonese selector and spinner translation repairs 2026-09-13 01:23:47 +03:00
Lauri Ojansivu df2d21fa6b fix: repair Aragonese swimlane selector and spinner labels 2026-09-13 01:23:32 +03:00
Lauri Ojansivu e70a76e46e docs: record Aragonese archive and unsaved description repairs 2026-09-13 01:22:59 +03:00
Lauri Ojansivu eacbe7e32e fix: repair Aragonese archive and unsaved description labels 2026-09-13 01:22:42 +03:00
Lauri Ojansivu 13d33dfe88 docs: record Aragonese selection and mapping translation repairs 2026-09-13 01:22:12 +03:00
Lauri Ojansivu 154109217f fix: repair Aragonese board selection and member mapping labels 2026-09-13 01:21:55 +03:00
Lauri Ojansivu a58b2f08fb docs: record Aragonese board import and archive repairs 2026-09-13 01:21:24 +03:00
Lauri Ojansivu 5388ec494f fix: repair Aragonese board import and archive guidance 2026-09-13 01:21:08 +03:00
Lauri Ojansivu 6df901860d docs: record Aragonese storage and backup translation repairs 2026-09-13 01:20:37 +03:00
Lauri Ojansivu 245193f6e9 fix: repair Aragonese storage and backup guidance 2026-09-13 01:20:21 +03:00
Lauri Ojansivu 754d7a52fe Update mirrors 2026-09-13 01:19:54 +03:00
Lauri Ojansivu 2abc367806 docs: record Aragonese template and attachment translation repairs 2026-09-13 01:19:52 +03:00
Lauri Ojansivu 6881aac926 fix: repair Aragonese template and attachment settings labels 2026-09-13 01:19:35 +03:00
Lauri Ojansivu 55578fb997 docs: record Aragonese activity translation repairs 2026-09-13 01:19:05 +03:00
Lauri Ojansivu 2982ebf2c0 Updated mirrors. 2026-09-13 01:18:50 +03:00
Lauri Ojansivu de9c10e166 fix: repair Aragonese activity and reminder translations 2026-09-13 01:18:49 +03:00
Lauri Ojansivu 674e35f502 docs: record Aragonese calendar and account translation repairs 2026-09-13 01:18:17 +03:00
Lauri Ojansivu 4b503692e7 fix: repair Aragonese calendar and account lockout translations 2026-09-13 01:18:02 +03:00
Lauri Ojansivu cd7387e4b5 docs: record completion of flagged Asturian translation repairs 2026-09-13 01:17:25 +03:00
Lauri Ojansivu 6147f72f65 fix: repair Asturian advanced filter and Hijri calendar translations 2026-09-13 01:16:58 +03:00
Lauri Ojansivu b1aa64f25d docs: record Asturian WIP warning translation repairs 2026-09-13 01:16:22 +03:00
Lauri Ojansivu b71df946bf fix: repair Asturian WIP warnings and vote deletion text 2026-09-13 01:16:03 +03:00
Lauri Ojansivu effc49bc7f docs: record Asturian swimlane and administrator guidance repairs 2026-09-13 01:15:34 +03:00
Lauri Ojansivu 0acb00beb8 fix: repair Asturian swimlane and administrator guidance 2026-09-13 01:15:19 +03:00
Lauri Ojansivu 35f0b29a80 docs: record Asturian week and swimlane translation repairs 2026-09-13 01:14:47 +03:00
Lauri Ojansivu 0ec7a74a90 Update mirrors 2026-09-13 01:14:40 +03:00
Lauri Ojansivu c07df2902d fix: repair Asturian week and swimlane settings translations 2026-09-13 01:14:33 +03:00
Lauri Ojansivu 0bc7f99fe8 docs: record Asturian SMTP and calendar label repairs 2026-09-13 01:13:52 +03:00
Lauri Ojansivu 99188093d6 fix: repair Asturian SMTP and calendar display labels 2026-09-13 01:13:34 +03:00
Lauri Ojansivu d1e0e2fb04 docs: record Asturian sidebar and card display repairs 2026-09-13 01:13:03 +03:00
Lauri Ojansivu 2f949d4f87 fix: repair Asturian sidebar shortcuts and card display labels 2026-09-13 01:12:45 +03:00
Lauri Ojansivu a9f079f16f docs: record Asturian WIP and shortcut translation repairs 2026-09-13 01:12:14 +03:00
Lauri Ojansivu e4b3295f4c fix: repair Asturian WIP settings and shortcut labels 2026-09-13 01:12:00 +03:00
Lauri Ojansivu 54cee9e62a docs: record Asturian diagnostics translation repairs 2026-09-13 01:11:32 +03:00
Lauri Ojansivu ba9ec6b9dd fix: repair Asturian diagnostics and swimlane height labels 2026-09-13 01:11:17 +03:00
Lauri Ojansivu 8558bc8fac docs: record Asturian S3 translation repairs 2026-09-13 01:10:46 +03:00
Lauri Ojansivu e89f461ce6 fix: repair Asturian S3 configuration translations 2026-09-13 01:10:32 +03:00
Lauri Ojansivu 88dbc2d978 docs: record Asturian removal and restoration repairs 2026-09-13 01:10:03 +03:00
Lauri Ojansivu ad416a2e20 fix: repair Asturian removal and restoration translations 2026-09-13 01:09:49 +03:00
Lauri Ojansivu d76c9de758 docs: record Asturian checklist trigger translation repairs 2026-09-13 01:09:21 +03:00
Lauri Ojansivu 20b9b14e13 fix: repair Asturian checklist trigger translations 2026-09-13 01:09:08 +03:00
Lauri Ojansivu 1d3cb5ec94 docs: record Asturian checklist rule translation repairs 2026-09-13 01:08:40 +03:00
Lauri Ojansivu e0a803e38e fix: repair Asturian checklist rule actions 2026-09-13 01:08:25 +03:00
Lauri Ojansivu 441d9cf844 docs: record Asturian upload help and matching note repairs 2026-09-13 01:07:58 +03:00
Lauri Ojansivu 3378009386 fix: repair Asturian upload help and rule matching notes 2026-09-13 01:07:43 +03:00
Lauri Ojansivu af265c7656 docs: record Asturian validation and access message repairs 2026-09-13 01:07:10 +03:00
Lauri Ojansivu 8147538b87 fix: repair Asturian search validation and access messages 2026-09-13 01:06:57 +03:00
Lauri Ojansivu dc73ba9b75 docs: record Asturian checklist creation translation repairs 2026-09-13 01:06:23 +03:00
Lauri Ojansivu cddc1d83a4 fix: repair Asturian checklist creation and archive labels 2026-09-13 01:06:08 +03:00
Lauri Ojansivu b012a2877a docs: record Asturian migration and storage translation repairs 2026-09-13 01:05:37 +03:00
Lauri Ojansivu 8d4dec7e5c fix: repair Asturian migration and storage translations 2026-09-13 01:05:24 +03:00
Lauri Ojansivu 0397939580 docs: record Asturian list and migration translation repairs 2026-09-13 01:04:56 +03:00
Lauri Ojansivu 56bc96c6a8 fix: repair Asturian list and migration status translations 2026-09-13 01:04:41 +03:00
Lauri Ojansivu 1071536709 docs: record Asturian import and deletion warning repairs 2026-09-13 01:04:13 +03:00
Lauri Ojansivu eb7f1a43eb fix: repair Asturian import and deletion warnings 2026-09-13 01:04:00 +03:00
Lauri Ojansivu 803a571535 docs: record Asturian visibility and import help repairs 2026-09-13 01:03:29 +03:00
Lauri Ojansivu de737d28f3 fix: repair Asturian checklist visibility and CSV help 2026-09-13 01:03:16 +03:00
Lauri Ojansivu 6da7e93ef6 docs: record Asturian search instruction translation repairs 2026-09-13 01:02:47 +03:00
Lauri Ojansivu 6e5f18691a fix: repair Asturian search instructions and filter translations 2026-09-13 01:02:34 +03:00
Lauri Ojansivu f58836825c docs: record Asturian access and filter translation repairs 2026-09-13 01:02:01 +03:00
Lauri Ojansivu 4e54386a0a fix: repair Asturian access errors and filter translations 2026-09-13 01:01:49 +03:00
Lauri Ojansivu 123a8aece2 docs: record Asturian validation translation repairs 2026-09-13 01:01:21 +03:00
Lauri Ojansivu b0a65c1a73 fix: repair Asturian validation and display translations 2026-09-13 01:01:07 +03:00
Lauri Ojansivu 620e4bba24 docs: record Asturian email template translation repairs 2026-09-13 01:00:40 +03:00
Lauri Ojansivu 472676d3b0 fix: repair Asturian email template translations 2026-09-13 01:00:28 +03:00
Lauri Ojansivu d0f741fa49 docs: record Asturian voting and email translation repairs 2026-09-13 00:59:59 +03:00
Lauri Ojansivu f4ceeed39f fix: repair Asturian voting and email translations 2026-09-13 00:59:45 +03:00
Lauri Ojansivu 9ea528de1d docs: record Asturian date popup translation repairs 2026-09-13 00:59:16 +03:00
Lauri Ojansivu 6cac2fbe28 fix: repair Asturian date and action popup translations 2026-09-13 00:59:04 +03:00
Lauri Ojansivu 1fb3aafa16 docs: record Asturian deletion translation audit progress 2026-09-13 00:58:27 +03:00
Lauri Ojansivu b4091f5214 fix: repair Asturian deletion and administration translations 2026-09-13 00:58:14 +03:00
Lauri Ojansivu aa836525bd docs: update Asturian branding translation audit progress 2026-09-13 00:57:46 +03:00
Lauri Ojansivu 572172c23b fix: repair Asturian sort order and branding translations 2026-09-13 00:57:33 +03:00
Lauri Ojansivu 75c88ee221 docs: record Asturian checklist translation repairs 2026-09-13 00:57:03 +03:00
Lauri Ojansivu 7a3f3c07fa fix: repair Asturian checklist and clipboard actions 2026-09-13 00:56:51 +03:00
Lauri Ojansivu c4af92bcb8 docs: update Asturian popup translation audit progress 2026-09-13 00:56:22 +03:00
Lauri Ojansivu 0b2904bdf4 fix: repair Asturian popup and clipboard translations 2026-09-13 00:56:10 +03:00
Lauri Ojansivu fef64e9be9 docs: record Asturian translation repair progress 2026-09-13 00:55:31 +03:00
Lauri Ojansivu dacbe7416f fix: repair Asturian attachment and list display translations 2026-09-13 00:55:13 +03:00
Lauri Ojansivu 5eb9b710aa docs: refresh concise translation audit progress summary 2026-09-13 00:54:47 +03:00
Lauri Ojansivu f2d3129f61 docs: record Asturian HTML placement and warning repairs 2026-09-13 00:52:57 +03:00
Lauri Ojansivu 29f806de02 fix: repair Asturian HTML placement and loading warnings 2026-09-13 00:52:46 +03:00
Lauri Ojansivu 85291e10e3 docs: record Asturian date and custom field translation repairs 2026-09-13 00:52:21 +03:00
Lauri Ojansivu 4adf79a4d2 fix: repair Asturian date and custom field activity labels 2026-09-13 00:52:10 +03:00
Lauri Ojansivu a5830e2bc8 docs: record Asturian checklist activity translation repairs 2026-09-13 00:51:41 +03:00
Lauri Ojansivu e986219416 fix: repair Asturian checklist activity labels 2026-09-13 00:51:29 +03:00
Lauri Ojansivu 66d38c5115 docs: record Asturian date activity translation progress 2026-09-13 00:50:59 +03:00
Lauri Ojansivu 611cdd816b fix: review Asturian date activity and accessibility messages 2026-09-13 00:50:48 +03:00
Lauri Ojansivu e53fde6249 docs: record Asturian diagnostics and date translation review 2026-09-13 00:50:18 +03:00
Lauri Ojansivu 9a9a411ab4 fix: review Asturian diagnostics and date change messages 2026-09-13 00:50:07 +03:00
Lauri Ojansivu 75ee6be992 docs: record Asturian export and warning translation repairs 2026-09-13 00:49:39 +03:00
Lauri Ojansivu d11f7da3a4 fix: repair Asturian export restrictions and unsaved warnings 2026-09-13 00:49:27 +03:00
Lauri Ojansivu 0f1eb6b184 docs: record Asturian display and text trigger repairs 2026-09-13 00:49:02 +03:00
Lauri Ojansivu 06c625c1c1 fix: repair Asturian display and text trigger translations 2026-09-13 00:48:52 +03:00
Lauri Ojansivu 00933255be docs: record Asturian shortcut and count translation repairs 2026-09-13 00:48:23 +03:00
Lauri Ojansivu f3661b1232 fix: repair Asturian shortcut and card count labels 2026-09-13 00:48:13 +03:00
Lauri Ojansivu 7a1b69bbd7 docs: record Asturian recovery and storage translation repairs 2026-09-13 00:47:43 +03:00
Lauri Ojansivu 5d1b43f99e fix: repair Asturian recovery and storage setting messages 2026-09-13 00:47:23 +03:00
Lauri Ojansivu a059454069 docs: record Asturian rule and membership translation repairs 2026-09-13 00:46:58 +03:00
Lauri Ojansivu 478fdefe26 fix: repair Asturian rule positions and member removal warnings 2026-09-13 00:46:48 +03:00
Lauri Ojansivu 048022d6e5 docs: record Asturian public board and invitation repairs 2026-09-13 00:46:22 +03:00
Lauri Ojansivu afc9694cdf fix: repair Asturian public board and invitation messages 2026-09-13 00:46:11 +03:00
Lauri Ojansivu 335cbe4c81 docs: record Asturian notification and permission repairs 2026-09-13 00:45:44 +03:00
Lauri Ojansivu 6820358a1e fix: repair Asturian notification and normal user permissions 2026-09-13 00:45:33 +03:00
Lauri Ojansivu f529344ef2 docs: record Asturian member mapping translation repairs 2026-09-13 00:45:07 +03:00
Lauri Ojansivu 7c8dc55912 fix: repair Asturian member mapping and storage messages 2026-09-13 00:44:57 +03:00
Lauri Ojansivu 8bf61169e2 docs: record Asturian label and list archive repairs 2026-09-13 00:44:31 +03:00
Lauri Ojansivu 2adbe678f7 fix: repair Asturian label and list archive translations 2026-09-13 00:44:17 +03:00
Lauri Ojansivu 067fe99fc3 docs: record Asturian import mapping translation repairs 2026-09-13 00:43:48 +03:00
Lauri Ojansivu 1b7d2be790 fix: repair Asturian import mapping and keyboard messages 2026-09-13 00:43:38 +03:00
Lauri Ojansivu 79cdd74304 docs: record Asturian search scope and time tracking repairs 2026-09-13 00:43:10 +03:00
Lauri Ojansivu 3774b2bb0b fix: repair Asturian search scope and time tracking translations 2026-09-13 00:42:59 +03:00
Lauri Ojansivu a77125bc60 docs: record Asturian search operator translation repairs 2026-09-13 00:42:34 +03:00
Lauri Ojansivu f7560b4212 fix: repair Asturian search operator descriptions 2026-09-13 00:42:23 +03:00
Lauri Ojansivu 93f231f380 docs: record Asturian filter and search translation repairs 2026-09-13 00:41:55 +03:00
Lauri Ojansivu 835c560da7 fix: repair Asturian filter and search instructions 2026-09-13 00:41:46 +03:00
Lauri Ojansivu 92c348ea46 docs: record Asturian email and permission translation repairs 2026-09-13 00:41:15 +03:00
Lauri Ojansivu d03be9d5ae fix: repair Asturian email and board permission translations 2026-09-13 00:41:05 +03:00
Lauri Ojansivu 5c42166dc6 docs: record Asturian invitation translation repairs 2026-09-13 00:40:40 +03:00
Lauri Ojansivu 539a4a2552 fix: repair Asturian invitation and due card translations 2026-09-13 00:40:29 +03:00
Lauri Ojansivu b97e07d416 docs: record Asturian custom field and deletion repairs 2026-09-13 00:39:55 +03:00
Lauri Ojansivu d82b649d76 fix: repair Asturian custom field and deletion warnings 2026-09-13 00:39:44 +03:00
Lauri Ojansivu a55a91bbfe docs: record Asturian template and comment translation repairs 2026-09-13 00:39:17 +03:00
Lauri Ojansivu bdca82efc7 fix: repair Asturian template copy and comment settings 2026-09-13 00:39:06 +03:00
Lauri Ojansivu 3b674445ad docs: record Asturian sorting and favorite translation repairs 2026-09-13 00:38:41 +03:00
Lauri Ojansivu ec2e3728ba fix: repair Asturian sorting and favorite controls 2026-09-13 00:38:28 +03:00
Lauri Ojansivu bd9dff7bc0 docs: record Asturian card archive and deletion repairs 2026-09-13 00:38:04 +03:00
Lauri Ojansivu f6e01322db fix: repair Asturian card archive and deletion translations 2026-09-13 00:37:54 +03:00
Lauri Ojansivu 04f9b56fc2 docs: record Asturian board visibility translation repairs 2026-09-13 00:37:27 +03:00
Lauri Ojansivu 9f5d34bf83 fix: repair Asturian board visibility and popup titles 2026-09-13 00:37:17 +03:00
Lauri Ojansivu d7bc7fda04 docs: record Asturian board scheduling translation repairs 2026-09-13 00:36:49 +03:00
Lauri Ojansivu 3a39c60ce5 fix: repair Asturian board scheduling and deletion warnings 2026-09-13 00:36:39 +03:00
Lauri Ojansivu e32d5a13d2 docs: record Asturian user state and board setting repairs 2026-09-13 00:36:12 +03:00
Lauri Ojansivu eaa4987eff fix: repair Asturian user states and board settings translations 2026-09-13 00:36:02 +03:00
Lauri Ojansivu 5894baa124 docs: record Asturian creation label translation repairs 2026-09-13 00:35:35 +03:00
Lauri Ojansivu ee6e12bced fix: repair Asturian card and checklist creation labels 2026-09-13 00:35:25 +03:00
Lauri Ojansivu 49c119be44 docs: record Asturian restoration and checklist translation repairs 2026-09-13 00:35:01 +03:00
Lauri Ojansivu 942ed9d1ff fix: repair Asturian restoration and checklist state translations 2026-09-13 00:34:49 +03:00
Lauri Ojansivu 1a5788b04a docs: record Asturian movement and removal translation repairs 2026-09-13 00:34:23 +03:00
Lauri Ojansivu e54072ee19 fix: repair Asturian movement and removal translations 2026-09-13 00:34:13 +03:00
Lauri Ojansivu 7c278d6aa8 docs: record Asturian creation and comment translation repairs 2026-09-13 00:33:45 +03:00
Lauri Ojansivu 5c98005ffd fix: repair Asturian creation and comment activity translations 2026-09-13 00:33:34 +03:00
Lauri Ojansivu 32d112b70c docs: record Asturian activity translation repairs 2026-09-13 00:33:02 +03:00
Lauri Ojansivu c78a3f30eb fix: repair Asturian activity translations 2026-09-13 00:32:54 +03:00
Lauri Ojansivu f2939f1079 docs: record Asturian account protection translation progress 2026-09-13 00:32:22 +03:00
Lauri Ojansivu 98773de936 fix: repair Asturian account protection translations 2026-09-13 00:32:12 +03:00
Lauri Ojansivu 1423d1dcd6 docs: record completion of flagged base Galician review 2026-09-13 00:31:43 +03:00
Lauri Ojansivu 0fcfb0e591 fix: finish flagged base Galician translation review 2026-09-13 00:31:25 +03:00
Lauri Ojansivu 60b43f5b74 docs: record completion of flagged Galician regional repairs 2026-09-13 00:30:48 +03:00
Lauri Ojansivu 3de5b15ca2 fix: finish flagged Galician regional translation repairs 2026-09-13 00:30:32 +03:00
Lauri Ojansivu c591f6044d docs: record Galician S3 and troubleshooting translation repairs 2026-09-13 00:30:02 +03:00
Lauri Ojansivu 1b06f4cb7e fix: repair Galician regional S3 and troubleshooting translations 2026-09-13 00:29:47 +03:00
Lauri Ojansivu a709e3b963 docs: record Galician migration limits and monitoring translation repairs 2026-09-13 00:29:17 +03:00
Lauri Ojansivu bb288913e0 fix: repair Galician regional migration limits and monitoring messages 2026-09-13 00:29:03 +03:00
Lauri Ojansivu 0023fccb82 docs: record Galician search and import translation repairs 2026-09-13 00:28:39 +03:00
Lauri Ojansivu 5fe2d75a23 fix: repair Galician regional search and import translations 2026-09-13 00:28:25 +03:00
Lauri Ojansivu 2539cc63ff docs: record Galician email and export translation repairs 2026-09-13 00:27:59 +03:00
Lauri Ojansivu 427d86c04c fix: repair Galician regional email and export translations 2026-09-13 00:27:44 +03:00
Lauri Ojansivu 93482e8aa7 docs: record Galician customization and migration translation repairs 2026-09-13 00:27:19 +03:00
Lauri Ojansivu 415883c9fa fix: repair Galician regional customization and migration translations 2026-09-13 00:27:04 +03:00
Lauri Ojansivu 63331f2dc5 docs: record Galician storage and scheduled job translation repairs 2026-09-13 00:26:40 +03:00
Lauri Ojansivu b2cdec01e9 fix: repair Galician regional storage and scheduled job translations 2026-09-13 00:26:23 +03:00
Lauri Ojansivu e771bfbdfe docs: record Galician activity and administration translation repairs 2026-09-13 00:25:54 +03:00
Lauri Ojansivu 2f6e6884e1 fix: repair Galician regional activities and administration translations 2026-09-13 00:25:40 +03:00
Lauri Ojansivu 6768de2a34 docs: record Galician account protection and date translation repairs 2026-09-13 00:25:14 +03:00
Lauri Ojansivu da98201307 fix: repair Galician regional account protection and date messages 2026-09-13 00:25:00 +03:00
Lauri Ojansivu 2dacc12d77 docs: record Galician account and diagnostics translation repairs 2026-09-13 00:24:35 +03:00
Lauri Ojansivu 60364ccc13 fix: repair Galician regional account and memory diagnostics translations 2026-09-13 00:24:20 +03:00
Lauri Ojansivu 5669a7d43d docs: record Galician display and swimlane translation repairs 2026-09-13 00:23:53 +03:00
Lauri Ojansivu 767bbcd84e fix: repair Galician regional display and swimlane translations 2026-09-13 00:23:38 +03:00
Lauri Ojansivu b6b6abe221 docs: record Galician migration confirmation translation repairs 2026-09-13 00:23:15 +03:00
Lauri Ojansivu 70864992f2 fix: repair Galician regional migration confirmations and controls 2026-09-13 00:23:01 +03:00
Lauri Ojansivu 0db18ddfc8 docs: record Galician rules and recovery translation repairs 2026-09-13 00:22:43 +03:00
Lauri Ojansivu 548be4c4de Added bitbucket mirror.
Thanks to bitbucket !
2026-09-13 00:21:53 +03:00
Lauri Ojansivu d05f421760 fix: repair Galician regional rules and recovery translations 2026-09-13 00:17:18 +03:00
Lauri Ojansivu 63d367e730 docs: record Galician visibility and notification translation repairs 2026-09-13 00:16:54 +03:00
Lauri Ojansivu 03b8a8a4fd fix: repair Galician regional visibility and notification translations 2026-09-13 00:16:39 +03:00
Lauri Ojansivu 8dedda581b docs: record Galician migration and attachment translation repairs 2026-09-13 00:16:17 +03:00
Lauri Ojansivu 97124a0d4e fix: repair Galician regional migration and attachment translations 2026-09-13 00:16:03 +03:00
Lauri Ojansivu 2a1547cae5 docs: record Galician membership and list translation repairs 2026-09-13 00:15:40 +03:00
Lauri Ojansivu c5429b159d fix: repair Galician regional list and membership translations 2026-09-13 00:15:27 +03:00
Lauri Ojansivu 2762156c8c docs: shorten translation audit progress summary 2026-09-13 00:15:01 +03:00
Lauri Ojansivu 6e06ced2a3 Update short translation audit after Galician credential repairs 2026-09-13 00:13:06 +03:00
Lauri Ojansivu d98e80bb30 Repair Galician regional credentials and label deletion warnings 2026-09-13 00:12:52 +03:00
Lauri Ojansivu 2aaf681374 Update short translation audit after Galician import repairs 2026-09-13 00:12:31 +03:00
Lauri Ojansivu 5e89d53cf9 Repair Galician regional import and checked item instructions 2026-09-13 00:12:18 +03:00
Lauri Ojansivu 115e004b58 Update short translation audit after Galician visibility repairs 2026-09-13 00:11:54 +03:00
Lauri Ojansivu 9100900db9 Repair Galician regional time filters and checklist visibility 2026-09-13 00:11:41 +03:00
Lauri Ojansivu 8a44b457ee Update short translation audit after Galician search status repairs 2026-09-13 00:11:19 +03:00
Lauri Ojansivu 4b6fcaa8c1 Repair Galician regional search status and all board search title 2026-09-13 00:11:06 +03:00
Lauri Ojansivu 93dd4af932 Update short translation audit after Galician board scope repairs 2026-09-13 00:10:44 +03:00
Lauri Ojansivu 10cc133fe9 Repair Galician regional board scoped search operators 2026-09-13 00:10:30 +03:00
Lauri Ojansivu 4694449354 Update short translation audit after Galician operator limit repairs 2026-09-13 00:10:08 +03:00
Lauri Ojansivu 3c142fa6cf Repair Galician regional search day limits and existence predicates 2026-09-13 00:09:54 +03:00
Lauri Ojansivu e5052b1535 Update short translation audit after Galician search condition repairs 2026-09-13 00:09:29 +03:00
Lauri Ojansivu 0f299014cb Repair Galician regional search conditions and operator descriptions 2026-09-13 00:09:13 +03:00
Lauri Ojansivu 7fb44d3f7e Update short translation audit after Galician search repairs 2026-09-13 00:08:51 +03:00
Lauri Ojansivu 068f54dc2f Repair Galician regional search and migration descriptions 2026-09-13 00:08:38 +03:00
Lauri Ojansivu 6ec17537d9 Update short translation audit after Galician validation repairs 2026-09-13 00:08:17 +03:00
Lauri Ojansivu 9adbfda106 Repair Galician regional JSON validation and Excel export messages 2026-09-13 00:08:02 +03:00
Lauri Ojansivu 17482e801b Update short translation audit after Galician invitation repairs 2026-09-13 00:07:42 +03:00
Lauri Ojansivu db4c2bdd9b Repair Galician regional invitations and board permission errors 2026-09-13 00:07:29 +03:00
Lauri Ojansivu 10307d3ca0 Update translation audit progress and current correction links 2026-09-13 00:07:05 +03:00
Lauri Ojansivu e80df7de02 Repair Galician regional due card permissions and account deletion warnings 2026-09-13 00:06:51 +03:00
Lauri Ojansivu 984e1bd13f CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-13 00:06:43 +03:00
Lauri Ojansivu 3b4ef69b22 Update short translation audit after Galician deletion safeguard repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 377370367f Repair Galician regional deletion safeguards and confirmations 2026-09-13 00:06:29 +03:00
Lauri Ojansivu cf598dc379 Update short translation audit after Galician template repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 43e16f0128 Repair Galician regional template copying and custom field warnings 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 5a3afb330b Update short translation audit after Galician conversion repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu dccb9b9b83 Repair Galician regional conversion and checklist copy messages 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 650f303d3f Update short translation audit after Galician comment control repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu fee4a4b23c Repair Galician regional checklist and comment permission controls 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 40b68f3f82 Update short translation audit after Galician card deletion repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu be7fa49a27 Repair Galician regional card deletion and assignee messages 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 9173e8d1b0 Update short translation audit after Galician board control repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 837c590a60 Repair Galician regional board assignee and card archive messages 2026-09-13 00:06:29 +03:00
Lauri Ojansivu c5497100c9 Update short translation audit after Galician scheduling repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 99f5360732 Repair Galician regional board scheduling and deletion messages 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 9bae6699f1 Update short translation audit after Galician attachment setting repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 134d8c6dd0 Repair Galician regional attachment and board archive settings 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 9e2506aa37 Update short translation audit after Galician archive control repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 953b85ba9f Repair Galician regional user status and archive controls 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 11f2e56eee Update short translation audit after Galician creation control repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu d4bc1452ec Repair Galician regional creation controls and administrator description 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 21d6667e1c Update dated translation audit after Galician card placement repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 1d133f6d65 Repair Galician regional checklist and card placement messages 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 1c9954639a Update short translation audit after Galician checklist state repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 04e1099334 Repair Galician regional checklist state activity translations 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 52e77cd3ff Update short translation audit after Galician move activity repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu ccd597b9a1 Repair Galician regional move and removal activity translations 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 069cde438e Update short translation audit after Galician creation activity repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu ce40c66be5 Repair Galician regional creation deletion and import activity translations 2026-09-13 00:06:29 +03:00
Lauri Ojansivu b6bbde06fa Update short translation audit after Galician activity repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 4ee07e41b0 Repair Galician regional archive and checklist activity translations 2026-09-13 00:06:29 +03:00
Lauri Ojansivu b072543d5d Update short translation audit after Galician regional repairs 2026-09-13 00:06:29 +03:00
Lauri Ojansivu 1b11ec4f37 Replace Portuguese lockout and activity wording with reviewed Galician translations 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 0856a397a5 Record completion of flagged Slovenian translation queues 2026-09-13 00:06:28 +03:00
Lauri Ojansivu dcd2b68150 Finish flagged Slovenian translation repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu eeabb6794c Update short translation audit after Slovenian shortcut repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 72f95b7083 Repair Slovenian shortcut instructions and export restrictions 2026-09-13 00:06:28 +03:00
Lauri Ojansivu c4db79b9ce Update short translation audit after Slovenian support repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 6c6e567d37 Repair Slovenian support scope and swimlane validation messages 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 96ad223ae5 Update short translation audit after Slovenian migration step repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu d868269220 Repair Slovenian migration step terminology 2026-09-13 00:06:28 +03:00
Lauri Ojansivu d999496ae9 Update short translation audit after Slovenian display repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 72bf36cf43 Repair Slovenian board display and field sum controls 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 29c0248f78 Update short translation audit after Slovenian troubleshooting repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 5aab614c48 Repair Slovenian search scope and troubleshooting instructions 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 4761de5dd3 Update short translation audit after Slovenian S3 configuration repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 165b6bde50 Repair Slovenian S3 configuration and backup scheduling labels 2026-09-13 00:06:28 +03:00
Lauri Ojansivu de3d0d039c Update short translation audit after Slovenian confirmation repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 41bde7259b Repair Slovenian migration confirmations and S3 labels 2026-09-13 00:06:28 +03:00
Lauri Ojansivu a15076c5ec Update short translation audit after Slovenian restoration repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 396eef7189 Repair Slovenian restoration and unsaved description messages 2026-09-13 00:06:28 +03:00
Lauri Ojansivu d9365e6c47 Update short translation audit after Slovenian permission repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 0b61362da1 Repair Slovenian read permissions and action warnings 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 58756e5b47 Update short translation audit after Slovenian validation repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu c87fab15d0 Repair Slovenian permission and search validation messages 2026-09-13 00:06:28 +03:00
Lauri Ojansivu fde9f7f029 Update short translation audit after Slovenian card view repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 8608a6524b Repair Slovenian card views and multi selection messages 2026-09-13 00:06:28 +03:00
Lauri Ojansivu faef2168a6 Update short translation audit after Slovenian attachment move repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 21b6a673fb Repair Slovenian migration permissions and attachment move scope 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 74a6b83cac Update short translation audit after Slovenian migration status repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 25e6b0f917 Repair Slovenian migration status and browser guidance 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 325f27eaeb Update short translation audit after Slovenian storage repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 1220d61867 Repair Slovenian storage migration limits and upload labels 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 410ca9b462 Update short translation audit after Slovenian import repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu c54dc69c18 Repair Slovenian import and invitation instructions 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 21deccfc4e Update short translation audit after Slovenian status repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 6d795593f0 Repair Slovenian search status and checklist visibility messages 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 36f46cdb4b Update short translation audit after Slovenian operator repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu cabc9c93ef Repair Slovenian search operator descriptions and examples 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 87077ba128 Update short translation audit after Slovenian search repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu f801e3f324 Repair Slovenian search instructions and file URL migration messages 2026-09-13 00:06:28 +03:00
Lauri Ojansivu ee390350c0 Update short translation audit after Slovenian filter repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu cacb6a910f Repair Slovenian due card filters and vote date messages 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 3db4d381c0 Record Slovenian deletion repairs in short translation audit 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 234c360625 Repair Slovenian deletion safeguards and custom logo translations 2026-09-13 00:06:28 +03:00
Lauri Ojansivu e115989ad2 Update concise translation audit after Slovenian migration repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu e0ff5f86d2 Repair Slovenian migration messages and string template placeholder 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 822074396a Update short translation audit after Slovenian board repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu e57c76c363 Fix Slovenian board and checklist translations and retain valid Azure labels 2026-09-13 00:06:28 +03:00
Lauri Ojansivu e783842553 Record Slovenian repairs in concise translation audit summary 2026-09-13 00:06:28 +03:00
Lauri Ojansivu c7b7fa48b8 Repair Slovenian user permissions and attachment translations 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 7c1260d390 Update concise translation audit progress after Slovenian repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 2865c4f732 Fix Slovenian date activity and scheduled job translations 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 82399813fe Update Slovenian lockout translation repair summary 2026-09-13 00:06:28 +03:00
Lauri Ojansivu e83aeb7fac Repair Slovenian lockout status and mention messages 2026-09-13 00:06:28 +03:00
Lauri Ojansivu b45a92da85 Update Slovenian account translation repair summary 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 08767492a3 Repair Slovenian accessibility and account protection messages 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 6bd73e3a57 Update Slovenian memory translation repair summary 2026-09-13 00:06:28 +03:00
Lauri Ojansivu c3227b0219 Repair Slovenian memory metrics and retain valid reactivity labels 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 7fd814e982 Update Slovenian translation repair summary 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 494b42c986 Repair Slovenian wait indicators and memory labels 2026-09-13 00:06:28 +03:00
Lauri Ojansivu d32715d014 Record Bosnian audit queue completion 2026-09-13 00:06:28 +03:00
Lauri Ojansivu a9d0e4ebd4 Finish flagged Bosnian translation repairs 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 5bec579c65 Update migration step translation repair summary 2026-09-13 00:06:28 +03:00
Lauri Ojansivu ada3af19c2 Repair Bosnian migration steps and starred board help 2026-09-13 00:06:28 +03:00
Lauri Ojansivu 1224eb711c Update minicard translation repair summary 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 79d7fe500b Repair Bosnian minicard display and field sum labels 2026-09-13 00:06:27 +03:00
Lauri Ojansivu d2228faaae Update translation search and display repair summary 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 1b9f93cbc5 Repair Bosnian search scope and swimlane controls 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 418edea4fa Update S3 translation repair summary 2026-09-13 00:06:27 +03:00
Lauri Ojansivu f85e912adf Repair Bosnian S3 settings and backup translations 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 08db469fdb Update translation restoration repair summary 2026-09-13 00:06:27 +03:00
Lauri Ojansivu a1fbf5932a Repair Bosnian restoration warnings and S3 labels 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 8ed38329a3 Update concise translation repair summary 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 1b835520a5 Repair Bosnian recovery and migration confirmations 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 424425a099 Keep translation audit summary short and retain detailed evidence 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 14e12d1d9c Repair Bosnian read-only and member removal translations 2026-09-13 00:06:27 +03:00
Lauri Ojansivu a61e46349c Record Bosnian rule translation repair progress 2026-09-13 00:06:27 +03:00
Lauri Ojansivu d416ceceae Repair Bosnian rule actions and assigned read role 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 52bb401d8e Record Bosnian board permission repair progress 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 46772a9865 Repair Bosnian board visibility and rule guidance 2026-09-13 00:06:27 +03:00
Lauri Ojansivu cc08b31701 Record Bosnian validation translation repair progress 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 765ec8f9de Repair Bosnian query validation and notification messages 2026-09-13 00:06:27 +03:00
Lauri Ojansivu efa094d72b Record Bosnian card view translation repair progress 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 1629b780b2 Repair Bosnian My Cards and role descriptions 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 0dc0e7fb20 Record Bosnian movement translation repair progress 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 5f8e5f9a27 Repair Bosnian attachment movement and migration permissions 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 3fa0d322ec Record Bosnian migration outcome repair progress 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 4f256268d6 Repair Bosnian migration outcomes and browser warnings 2026-09-13 00:06:27 +03:00
Lauri Ojansivu a627f1950d Record Bosnian migration limit repair progress 2026-09-13 00:06:27 +03:00
Lauri Ojansivu ee612082c3 Repair Bosnian migration limits and storage labels 2026-09-13 00:06:27 +03:00
Lauri Ojansivu 645f10cdea Record Bosnian keyboard translation repair progress 2026-09-13 00:06:27 +03:00
Lauri Ojansivu a2ae2424b9 Repair Bosnian keyboard toggles and list deletion messages 2026-09-13 00:06:26 +03:00
Lauri Ojansivu a4b861f5a5 Record Bosnian import translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 7f1fcba795 Repair Bosnian board import and member mapping help 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 1fba33b801 Record Bosnian visibility translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 6a97ff0b6b Repair Bosnian GridFS and checklist visibility translations 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 3a57ccac3f Record Bosnian search status repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu e33acd0523 Repair Bosnian search status and assignment translations 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 2bc885d759 Record Bosnian search operator repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu abd8c53dd3 Repair Bosnian search operator translations 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 593f575ccd Record Bosnian search translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 4cca1809ad Repair Bosnian migration and global search help 2026-09-13 00:06:26 +03:00
Lauri Ojansivu e381f1b29c Record Bosnian file translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 172413419c Repair Bosnian file URL help and filter translations 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 38a602a98b Record Bosnian email translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 705fbcf574 Repair Bosnian invitation emails and due card controls 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 572da7f1bc Record Bosnian deletion restriction repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu c08f60d0a1 Repair Bosnian duplicate list and deletion restrictions 2026-09-13 00:06:26 +03:00
Lauri Ojansivu ae86531ec5 Record Bosnian deletion translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 4dbfcd59ea Repair Bosnian deletion warnings and custom URL translations 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 6af4e87d90 Record Bosnian scheduled job translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 8ee99e1e93 Repair Bosnian creation dates and scheduled job translations 2026-09-13 00:06:26 +03:00
Lauri Ojansivu b6881e5e6e Record Bosnian checklist translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 803b62c2d6 Repair Bosnian checklist and card access translations 2026-09-13 00:06:26 +03:00
Lauri Ojansivu f9e96b86d3 Record Bosnian board translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 6a959f3a60 Repair Bosnian board scheduling and settings translations 2026-09-13 00:06:26 +03:00
Lauri Ojansivu c9ab6beac1 Record Bosnian storage translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 2a4f699e4d Repair Bosnian attachment storage and avatar translations 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 7fd77d7e02 Record Bosnian administration translation repair progress 2026-09-13 00:06:26 +03:00
Lauri Ojansivu 47b2d6b12c Repair Bosnian administration and workspace translations 2026-09-13 00:06:25 +03:00
Lauri Ojansivu 10fedada0c Merge pull request #6690 from wekan/dependabot/npm_and_yarn/tests/playwright/playwright/test-1.63.0
Bump @playwright/test from 1.62.1 to 1.63.0 in /tests/playwright
2026-09-12 23:57:56 +03:00
dependabot[bot] a15b065b56 Bump @playwright/test from 1.62.1 to 1.63.0 in /tests/playwright
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.62.1 to 1.63.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.62.1...v1.63.0)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.63.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-12 20:32:52 +00:00
Lauri Ojansivu b999e21aaa Document evidence for local translation error provenance 2026-09-12 23:09:46 +03:00
Lauri Ojansivu fe8483cd71 Record Bosnian date translation repair progress 2026-09-12 23:08:15 +03:00
Lauri Ojansivu ca539fbe78 Repair Bosnian date activities and reminders 2026-09-12 23:08:00 +03:00
Lauri Ojansivu d3127919fa Record Bosnian account translation repair progress 2026-09-12 23:07:19 +03:00
Lauri Ojansivu 24a1d388cd Repair Bosnian account lockout translations 2026-09-12 23:07:04 +03:00
Lauri Ojansivu f4b966d37e Record Bosnian translation repair progress 2026-09-12 23:06:28 +03:00
Lauri Ojansivu 48b6b1bb2a Repair Bosnian memory, wait indicators and accessibility translations 2026-09-12 23:06:14 +03:00
Lauri Ojansivu 413ce99b2d Record Croatian audit completion and current repair totals 2026-09-12 23:05:24 +03:00
Lauri Ojansivu 0c5a561c82 Finish flagged Croatian translation repairs 2026-09-12 23:05:02 +03:00
Lauri Ojansivu 55cc7e21d3 Record Croatian step repairs and audit progress
Document dated fixes and remaining counts with access and entity regressions.

Thanks to xet7 !
2026-09-12 23:02:37 +03:00
Lauri Ojansivu 2019869c7a Repair Croatian migration steps and support access labels
Correct 20 reviewed values, restoring migration entity names, starred-board ordering, subtask actions and logged-in support scope.

Thanks to xet7 !
2026-09-12 23:02:20 +03:00
Lauri Ojansivu ac384f5727 Record Croatian display repairs and audit progress
Document dated fixes and remaining counts with display-meaning regressions.

Thanks to xet7 !
2026-09-12 23:01:53 +03:00
Lauri Ojansivu 13200137af Repair Croatian swimlane and minicard display controls
Correct 16 reviewed values, preserving pixel units, field sums, assignment filters and card-count scope.

Thanks to xet7 !
2026-09-12 23:01:30 +03:00
Lauri Ojansivu 1f9301aafa Record Croatian S3 repairs and audit progress
Document dated fixes and remaining counts with storage and search regressions.

Thanks to xet7 !
2026-09-12 23:01:06 +03:00
Lauri Ojansivu 6de9e9203a Repair Croatian S3 and search settings
Correct 16 reviewed values. Preserve MinIO, endpoint and region examples, search scope and literal troubleshooting commands.

Thanks to xet7 !
2026-09-12 23:00:48 +03:00
Lauri Ojansivu 5a14fa506c Record Croatian recovery scope repairs and audit progress
Document dated fixes and remaining counts with recovery and warning regressions.

Thanks to xet7 !
2026-09-12 23:00:22 +03:00
Lauri Ojansivu c5452ab2a2 Repair Croatian recovery scope and migration confirmations
Correct 12 reviewed values. Preserve entity types, non-archived scope, difficult-to-undo warning and duplicate-empty-list conditions with literal storage fields.

Thanks to xet7 !
2026-09-12 23:00:01 +03:00
Lauri Ojansivu 2a0cf2774b Record Croatian recovery repairs and audit progress
Document dated fixes and remaining counts with no-edit and recovery regressions.

Thanks to xet7 !
2026-09-12 22:59:31 +03:00
Lauri Ojansivu 02e229d336 Repair Croatian read-only roles and recovery messages
Correct 14 reviewed values, restoring no-edit restrictions, label range, member notifications and archived entity types while preserving field identifiers.

Thanks to xet7 !
2026-09-12 22:59:12 +03:00
Lauri Ojansivu c9b201dadf Record Croatian rule repairs and audit progress
Document dated fixes and remaining counts with permission and action regressions.

Thanks to xet7 !
2026-09-12 22:58:45 +03:00
Lauri Ojansivu 58f0d7b065 Repair Croatian rule actions and public-board invitations
Correct 16 reviewed values, preserving editing restrictions, invitation meaning, movement direction, unchecking and current date/time scope.

Thanks to xet7 !
2026-09-12 22:58:26 +03:00
Lauri Ojansivu 7c0ad1c163 Record Croatian validation repairs and audit progress
Document dated fixes and remaining counts with runtime rendering and access regressions.

Thanks to xet7 !
2026-09-12 22:57:59 +03:00
Lauri Ojansivu 38050f2515 Repair Croatian query validation and private-board messages
Correct 12 reviewed values. Preserve integer limits, login-link markup, irreversible planning-poker deletion and private-board access scope.

Thanks to xet7 !
2026-09-12 22:57:39 +03:00
Lauri Ojansivu 5ffa770bc0 Record Croatian view repairs and audit progress
Document dated fixes and remaining counts with permission and rendering regressions.

Thanks to xet7 !
2026-09-12 22:57:16 +03:00
Lauri Ojansivu 4004c2ebdb Repair Croatian card views and assigned-only permissions
Correct 14 reviewed values. Preserve assigned-only visibility, creator-or-member notifications, checklist line order and count placeholders.

Thanks to xet7 !
2026-09-12 22:56:57 +03:00
Lauri Ojansivu 6814a8795f Record Croatian movement repairs and audit progress
Document dated fixes and remaining counts with scope and sorting regressions.

Thanks to xet7 !
2026-09-12 22:56:32 +03:00
Lauri Ojansivu be37a2c326 Repair Croatian attachment movement and card sorting labels
Correct 12 reviewed values. Preserve board/all-attachment scope and storage identifiers, and replace legal-case wording with card and board terminology.

Thanks to xet7 !
2026-09-12 22:56:15 +03:00
Lauri Ojansivu 5947502f3f Record Croatian migration repairs and audit progress
Document dated corrections and remaining counts with operating-limit and warning regressions.

Thanks to xet7 !
2026-09-12 22:55:52 +03:00
Lauri Ojansivu 60f6479157 Repair Croatian migration status and operating limits
Correct 20 reviewed values. Preserve CPU threshold, millisecond range, background continuation and administrator restrictions; remove invented damaged-case recovery meanings.

Thanks to xet7 !
2026-09-12 22:55:34 +03:00
Lauri Ojansivu bb75d0e1e2 Record Croatian list repairs and audit progress
Document dated fixes and remaining counts with warning, scope and unit regressions.

Thanks to xet7 !
2026-09-12 22:55:04 +03:00
Lauri Ojansivu b238c35f2a Repair Croatian list warnings and storage migration controls
Correct 16 reviewed values. Preserve board-departure scope, irreversible list deletion, byte units and batch limits without inventing Amazon-cloud requirements.

Thanks to xet7 !
2026-09-12 22:54:46 +03:00
Lauri Ojansivu 6aa06dad94 Record Croatian mapping repairs and audit progress
Document dated fixes and remaining counts with fallback and toggle regressions.

Thanks to xet7 !
2026-09-12 22:54:17 +03:00
Lauri Ojansivu 95f1b2a53b Repair Croatian member mapping and keyboard toggles
Correct 12 reviewed values. Preserve unmapped-member fallback and registration meanings, restore toggle click instructions and irreversible label deletion.

Thanks to xet7 !
2026-09-12 22:53:58 +03:00
Lauri Ojansivu 6fc29e86df Record Croatian import repairs and audit progress
Document dated fixes and remaining counts with export and literal menu regressions.

Thanks to xet7 !
2026-09-12 22:53:33 +03:00
Lauri Ojansivu f110128f6c Repair Croatian checklist visibility and board import instructions
Correct 15 reviewed values, restoring checklist and attachment meanings and export direction while preserving literal Trello menu names.

Thanks to xet7 !
2026-09-12 22:53:14 +03:00
Lauri Ojansivu 03e1bfcceb Record Croatian status repairs and audit progress
Document dated fixes and remaining counts with scope and status-meaning regressions.

Thanks to xet7 !
2026-09-12 22:52:46 +03:00
Lauri Ojansivu 23bd5535a3 Repair Croatian organization and status search operators
Correct 12 reviewed values. Restore board-assignment, descending sort, end-date and board-visibility meanings while preserving query tokens.

Thanks to xet7 !
2026-09-12 22:52:27 +03:00
Lauri Ojansivu ec6462868f Record Croatian field operator repairs and audit progress
Document dated fixes and remaining counts with syntax and matching regressions.

Thanks to xet7 !
2026-09-12 22:51:58 +03:00
Lauri Ojansivu 89b2b4802d Repair Croatian field and label search instructions
Correct seven reviewed values. Restore has:-due syntax, color-or-name matching, positive integer limits and literal operator arguments.

Thanks to xet7 !
2026-09-12 22:51:38 +03:00
Lauri Ojansivu db18ba6b5a Record Croatian operator repairs and audit progress
Document dated fixes and verified remaining counts with syntax and date-range regressions.

Thanks to xet7 !
2026-09-12 22:51:08 +03:00
Lauri Ojansivu 11734e472f Repair Croatian date and user search operators
Correct eight reviewed values, preserving literal operator syntax, default archive scope and at-most date ranges.

Thanks to xet7 !
2026-09-12 22:50:48 +03:00
Lauri Ojansivu 8be2ef2049 Record Croatian search repairs and audit progress
Document dated fixes and remaining counts with literal query and Boolean regressions.

Thanks to xet7 !
2026-09-12 22:50:25 +03:00
Lauri Ojansivu 885563f364 Repair Croatian migration and Boolean search instructions
Correct 12 reviewed values. Restore executable query examples and Boolean meanings, preserving source tokens and case-insensitive search.

Thanks to xet7 !
2026-09-12 22:50:05 +03:00
Lauri Ojansivu ffb06673e2 Record Croatian filter repairs and audit progress
Document dated fixes and verified remaining counts with source-meaning regressions.

Thanks to xet7 !
2026-09-12 22:49:38 +03:00
Lauri Ojansivu 5a9354543b Repair Croatian verification, errors and filter labels
Correct 16 reviewed values, preserving account-email verification, CSV format requirements, week filters and file URL repair meanings.

Thanks to xet7 !
2026-09-12 22:49:17 +03:00
Lauri Ojansivu b22042b46a Record Croatian email repairs and audit progress
Document dated fixes and remaining counts with email rendering and permission regressions.

Thanks to xet7 !
2026-09-12 22:48:51 +03:00
Lauri Ojansivu 00c8c7b1f4 Repair Croatian account emails and due-card views
Correct 14 reviewed values. Preserve email placeholders, invitation rather than full-access promises, and permitted incomplete-card scope.

Thanks to xet7 !
2026-09-12 22:48:31 +03:00
Lauri Ojansivu 7e4b0db00e Record Croatian account deletion repairs and audit progress
Document dated fixes and verified remaining counts with deletion restriction regressions.

Thanks to xet7 !
2026-09-12 22:48:03 +03:00
Lauri Ojansivu 564bd800bf Repair Croatian organization and account deletion messages
Correct 12 reviewed values. Preserve irreversible deletion and existing-member restrictions, and restore subtask and label meanings.

Thanks to xet7 !
2026-09-12 22:47:46 +03:00
Lauri Ojansivu 16c248af0f Record Croatian deletion repairs and audit progress
Document dated fixes and remaining counts with scope and deletion-condition regressions.

Thanks to xet7 !
2026-09-12 22:47:19 +03:00
Lauri Ojansivu 3b4f99d241 Repair Croatian custom URLs and deletion prompts
Correct 16 reviewed values, preserving URL rather than Internet-only meanings, logo default height, duplicate-list conditions and linked-card deletion order.

Thanks to xet7 !
2026-09-12 22:47:00 +03:00
Lauri Ojansivu 32ab996263 Record Croatian template repairs and audit progress
Document dated fixes and remaining counts with token and deletion regressions.

Thanks to xet7 !
2026-09-12 22:46:29 +03:00
Lauri Ojansivu f1914d07df Repair Croatian scheduled migrations and template placeholder
Correct 16 reviewed values. Restore literal %{value}, preserve separator entities and irreversible field deletion, and replace legal-case recovery wording with migration terminology.

Thanks to xet7 !
2026-09-12 22:46:10 +03:00
Lauri Ojansivu 23e73c6744 Record Croatian conversion repairs and audit progress
Document dated corrections and remaining counts with permission and date-meaning regressions.

Thanks to xet7 !
2026-09-12 22:45:43 +03:00
Lauri Ojansivu 56454dbf9a Repair Croatian checklist forms and board conversion messages
Correct 18 reviewed values. Restore comment-only permissions, creation-date ordering and normal board use during conversion.

Thanks to xet7 !
2026-09-12 22:45:25 +03:00
Lauri Ojansivu 2e8e7cc3e7 Record Croatian board repairs and audit progress
Document dated fixes and verified remaining counts with kanban meaning regressions.

Thanks to xet7 !
2026-09-12 22:44:57 +03:00
Lauri Ojansivu 3ace61f587 Repair Croatian board settings and checklist controls
Correct 20 reviewed values. Restore board, member and assignee terminology and distinguish deleting a checklist from deleting one item.

Thanks to xet7 !
2026-09-12 22:44:38 +03:00
Lauri Ojansivu 3af82b8891 Record Croatian storage repairs and audit progress
Document dated fixes and remaining counts with scheduling and scope regressions.

Thanks to xet7 !
2026-09-12 22:44:14 +03:00
Lauri Ojansivu 685e388ab6 Repair Croatian storage paths and scheduled board operations
Correct 18 reviewed values. Restore URL-scheme rather than Internet-site meaning, new-card field scope, scheduled results and board-icon actions.

Thanks to xet7 !
2026-09-12 22:43:57 +03:00
Lauri Ojansivu 2a8d7c1135 Record Croatian user repairs and audit progress
Document dated fixes and verified remaining counts with semantic regressions.

Thanks to xet7 !
2026-09-12 22:43:33 +03:00
Lauri Ojansivu 78c5f9b423 Repair Croatian user status and attachment settings
Correct 18 reviewed values. Restore activation, workspace editing, logged-in user scope and refresh data-loss warning; preserve storage identifiers.

Thanks to xet7 !
2026-09-12 22:43:15 +03:00
Lauri Ojansivu 4ac76560b0 Record Croatian administration repairs and audit progress
Document dated fixes and remaining counts with runtime rendering and semantic regressions.

Thanks to xet7 !
2026-09-12 22:42:50 +03:00
Lauri Ojansivu 40db24a444 Repair Croatian administration and custom-field activities
Correct 16 reviewed values. Distinguish inactive accounts from payroll status and clearing field values from deleting fields. Preserve activity arguments and HTML delimiters.

Thanks to xet7 !
2026-09-12 22:42:31 +03:00
Lauri Ojansivu 1716e559d9 Record Croatian activity repairs and audit progress
Document dated corrections and remaining counts with runtime rendering regressions.

Thanks to xet7 !
2026-09-12 22:42:05 +03:00
Lauri Ojansivu 2df7a4d026 Repair Croatian lockout results and date activities
Correct 16 reviewed values, preserving current-time reminder and first-reminder meanings alongside activity tokens.

Thanks to xet7 !
2026-09-12 22:41:44 +03:00
Lauri Ojansivu 0dddf15021 Record Croatian account repairs and audit progress
Document dated fixes and remaining counts with account protection regressions.

Thanks to xet7 !
2026-09-12 22:41:16 +03:00
Lauri Ojansivu e2e15108e4 Repair Croatian accessibility and account protection translations
Replace 18 Serbian-seeded values with Croatian wording, preserving login failure, timing and unlock meanings.

Thanks to xet7 !
2026-09-12 22:40:58 +03:00
Lauri Ojansivu d2d8c127b6 Record Croatian JSON follow-up and passing audit regression
Document the incomplete older repair found by target-script coverage and its verified fix.

Thanks to xet7 !
2026-09-12 22:40:29 +03:00
Lauri Ojansivu a677ec84ca Correct Serbian prose in Croatian JSON card example
Keep literal JSON fields and use Croatian kanban wording. Target-script and correction checks pass.

Thanks to xet7 !
2026-09-12 22:40:22 +03:00
Lauri Ojansivu e3bfcb6832 Record Croatian metric repairs and audit progress
Document dated fixes and remaining counts with script and semantic regressions.

Thanks to xet7 !
2026-09-12 22:39:56 +03:00
Lauri Ojansivu 482ea38b95 Repair Croatian memory metrics and wait indicators
Replace 18 Serbian-seeded values with Croatian wording. Restore V8 zap-pattern and resident-set meanings using official Node documentation.

Thanks to xet7 !
2026-09-12 22:39:34 +03:00
Lauri Ojansivu fadbd18d7f Record completed Macedonian audit queue and remaining translation work
Document dated fixes with filter syntax, meaning and zero-queue regressions.

Thanks to xet7 !
2026-09-12 22:39:00 +03:00
Lauri Ojansivu d3569c77ed Finish flagged Macedonian translation repairs
Correct the final 28 flagged values, including swimlane warnings, shortcuts, voting, WIP limits and advanced filter prose. Preserve executable examples and technical identifiers.

Thanks to xet7 !
2026-09-12 22:38:39 +03:00
Lauri Ojansivu 3a6fe7c6c6 Record Macedonian SMTP repairs and audit progress
Document dated fixes and verified remaining counts with meaning regressions.

Thanks to xet7 !
2026-09-12 22:38:00 +03:00
Lauri Ojansivu ece4315d2a Repair Macedonian SMTP, migration steps and subtask controls
Correct 25 reviewed values, preserving outgoing-email, starred-board ordering, migration entity and logged-in support meanings.

Thanks to xet7 !
2026-09-12 22:37:41 +03:00
Lauri Ojansivu 835a81b7b7 Record Macedonian display repairs and audit progress
Document dated fixes, correct translations retained and verified remaining counts.

Thanks to xet7 !
2026-09-12 22:37:00 +03:00
Lauri Ojansivu 5ef5b155b6 Repair Macedonian display settings and retain valid sidebar translations
Correct 18 reviewed values and retain two correct Macedonian sidebar imperatives. Restore parent-card, checklist, field sum and filter meanings.

Thanks to xet7 !
2026-09-12 22:36:42 +03:00
Lauri Ojansivu 9ad6571cde Record Macedonian S3 repairs and audit progress
Document dated fixes, verified totals and regression coverage for storage identifiers and search meanings.

Thanks to xet7 !
2026-09-12 22:36:11 +03:00
Lauri Ojansivu b9da2ea975 Repair Macedonian S3 settings and search instructions
Correct 20 reviewed values. Preserve endpoint examples and troubleshooting commands; restore description/custom-field search scope, local MinIO support and swimlane dimensions.

Thanks to xet7 !
2026-09-12 22:35:52 +03:00
Lauri Ojansivu a2a2402edf Record Macedonian recovery repairs and audit progress
Document dated fixes and verified remaining counts with recovery and deletion-condition regressions.

Thanks to xet7 !
2026-09-12 22:35:25 +03:00
Lauri Ojansivu c9fe9530a8 Repair Macedonian recovery and migration confirmations
Correct 20 reviewed values. Restore all entity types, non-archived scope, duplicate-empty-list conditions and undo warning while preserving storage field identifiers.

Thanks to xet7 !
2026-09-12 22:35:07 +03:00
Lauri Ojansivu 15bc0559ff Record Macedonian rule repairs and audit progress
Document dated fixes and remaining counts with permission, direction and notification regressions.

Thanks to xet7 !
2026-09-12 22:34:30 +03:00
Lauri Ojansivu 1c6281af51 Repair Macedonian rule actions and read-only permissions
Correct 24 reviewed values, preserving move direction, uncheck actions, no-edit restrictions, label range and member-removal notification. Describe organization removal without invented access bans.

Thanks to xet7 !
2026-09-12 22:34:12 +03:00
Lauri Ojansivu 85d2dfcc89 Record Macedonian validation repairs and audit progress
Record dated fixes and remaining counts with meaning and runtime rendering regressions.

Thanks to xet7 !
2026-09-12 22:33:46 +03:00
Lauri Ojansivu 3e099f4d57 Repair Macedonian validation, visibility and invitation messages
Correct 20 reviewed values. Preserve positive-integer limits and login links, distinguish organizations from legal parties, and describe invitation rather than guaranteed full access.

Thanks to xet7 !
2026-09-12 22:33:27 +03:00
Lauri Ojansivu b177d44eb3 Record Macedonian view repairs and audit progress
Record dated corrections and verified totals with permission, notification and rendering regressions.

Thanks to xet7 !
2026-09-12 22:32:57 +03:00
Lauri Ojansivu 0effcb85ed Repair Macedonian card views, permissions and notifications
Correct 25 reviewed values covering attachment movement, selection, card views, checklist lines, permission descriptions and notifications. Preserve source restrictions and avoid invented legal access or Amazon-cloud meanings.

Thanks to xet7 !
2026-09-12 22:32:39 +03:00
Lauri Ojansivu b4db5c0463 Record Macedonian migration repairs and audit progress
Record the dated fix commit, verified counts and operational meaning regressions.

Thanks to xet7 !
2026-09-12 22:32:13 +03:00
Lauri Ojansivu f98c708e6c Repair Macedonian storage migration and monitoring messages
Correct 29 reviewed values. Preserve batch and CPU limits, background continuation, administrator restrictions and storage identifiers; remove invented damaged-case and Amazon-cloud meanings.

Thanks to xet7 !
2026-09-12 22:31:53 +03:00
Lauri Ojansivu 335826e781 Record Macedonian list repairs and audit progress
Document dated corrections, the local fix commit and remaining findings with behavioral translation regressions.

Thanks to xet7 !
2026-09-12 22:31:22 +03:00
Lauri Ojansivu 9fdbf20171 Repair Macedonian list controls and deletion warnings
Correct 23 reviewed values covering keyboard toggles, labels, leaving boards, list actions, loading and file limits. Restore click instructions and preserve irreversible deletion and last-administrator meanings.

Thanks to xet7 !
2026-09-12 22:31:04 +03:00
Lauri Ojansivu 8dc68b0182 Record Macedonian import repairs and audit progress
Record dated corrections, their local commit and remaining counts, with regressions for export direction and literal vendor menu names.

Thanks to xet7 !
2026-09-12 22:30:35 +03:00
Lauri Ojansivu f90ea9ac61 Repair Macedonian board import and registration instructions
Correct 16 reviewed values, including export menu wording, member mapping, attachment archives, invalid filenames and registration invitations. Preserve literal Trello menu names.

Thanks to xet7 !
2026-09-12 22:30:15 +03:00
Lauri Ojansivu 2e1b23aebd Record Macedonian status repairs and translation audit progress
Add meaning regressions and the dated correction commit, summary and remaining counts.

Thanks to xet7 !
2026-09-12 22:29:47 +03:00
Lauri Ojansivu 17efcc8eaa Repair Macedonian status, storage and checklist controls
Correct 20 reviewed values. Distinguish dated cards from completed cards, preserve private/public board meanings and restore checklist, attachment and member terminology.

Thanks to xet7 !
2026-09-12 22:29:30 +03:00
Lauri Ojansivu f0457ef249 Update translation audit progress and search meaning coverage
Record the dated 12-value Macedonian operator repair, its local commit, verified totals and remaining findings. Add positive and negative checks for executable field syntax and label matching meaning.

Thanks to xet7 !
2026-09-12 22:29:06 +03:00
Lauri Ojansivu ba2501e590 Repair Macedonian search operator meanings and literal examples
Correct 12 reviewed values. Restore has:-due syntax and label color-or-name meaning while preserving operator and predicate tokens.

Thanks to xet7 !
2026-09-12 22:26:57 +03:00
Lauri Ojansivu f82b3e5dea Record Macedonian Boolean search repairs and audit summary
Thanks to xet7 !
2026-09-12 22:26:27 +03:00
Lauri Ojansivu c1dbea0868 Repair Macedonian Boolean search help and operator examples
Correct 10 reviewed values. Preserve literal query examples, OR/AND meanings and case-insensitivity, with positive and negative regression checks.

Thanks to xet7 !
2026-09-12 22:26:13 +03:00
Lauri Ojansivu 30e3f3e66a Record Macedonian migration and search fixes in translation audit
Thanks to xet7 !
2026-09-12 22:25:42 +03:00
Lauri Ojansivu b3d08cb3ed Repair Macedonian migration and search instruction translations
Correct 10 reviewed values. Restore literal list:Blocked search syntax and operator meaning, and describe file/avatar URL and missing-list repairs accurately.

Thanks to xet7 !
2026-09-12 22:25:27 +03:00
Lauri Ojansivu 603ec48c63 Record Macedonian error and filter translation repairs
Thanks to xet7 !
2026-09-12 22:25:01 +03:00
Lauri Ojansivu f2db91a468 Repair Macedonian error reports and filter translations
Correct 20 reviewed values, restoring organization, team, file report and filter meanings while preserving source identifiers and placeholders.

Thanks to xet7 !
2026-09-12 22:24:45 +03:00
Lauri Ojansivu 10ff00b512 Record Macedonian email repairs and current translation audit summary
Thanks to xet7 !
2026-09-12 22:24:19 +03:00
Lauri Ojansivu 5a49318601 Repair Macedonian invitation email and permission translations
Correct 12 reviewed values while preserving account, board, invitation-code and URL placeholders. Restore invitation meaning without granting unrequested full access.

Thanks to xet7 !
2026-09-12 22:24:04 +03:00
Lauri Ojansivu 3cb48b1bf6 Record Macedonian date popup and enrollment repairs
Thanks to xet7 !
2026-09-12 22:23:37 +03:00
Lauri Ojansivu 999de898da Repair Macedonian date popup and enrollment translations
Correct 15 reviewed values. Distinguish due, end and received dates, restore card creator and sorting meaning, and preserve source placeholders.

Thanks to xet7 !
2026-09-12 22:23:23 +03:00
Lauri Ojansivu 2fe23fe915 Record Macedonian deletion translation fixes and audit progress
Thanks to xet7 !
2026-09-12 22:22:58 +03:00
Lauri Ojansivu fb82ac1331 Repair Macedonian deletion warnings and duplicate list migration help
Correct 20 reviewed values. Preserve the two required duplicate-list deletion conditions and restore organization, team and kanban terminology.

Thanks to xet7 !
2026-09-12 22:22:44 +03:00
Lauri Ojansivu 2a35635513 Record Macedonian settings repairs and current translation audit progress
Thanks to xet7 !
2026-09-12 22:22:14 +03:00
Lauri Ojansivu 3c7b1a1816 Repair Macedonian custom settings and template placeholder
Correct 20 reviewed values. Restore literal %{value}, separator entities, URL settings and scheduled migration meanings while preserving exact source tokens.

Thanks to xet7 !
2026-09-12 22:21:58 +03:00
Lauri Ojansivu 85a878e74d Record Macedonian scheduling and creation date repairs
Thanks to xet7 !
2026-09-12 22:21:29 +03:00
Lauri Ojansivu 1c1fbdfb04 Repair Macedonian scheduled job and creation date translations
Correct 15 reviewed values. Restore creation-date sorting and scheduled-migration meanings while preserving source tokens and JSON ordering.

Thanks to xet7 !
2026-09-12 22:21:15 +03:00
Lauri Ojansivu 91090dd69d Record Macedonian comment and conversion translation repairs
Thanks to xet7 !
2026-09-12 22:20:48 +03:00
Lauri Ojansivu e91e845570 Repair Macedonian comment and board conversion help
Correct 15 reviewed values, restoring source meanings in comments, checklist forms, favorites and board conversion instructions. Preserve interpolation tokens and verify repair behavior.

Thanks to xet7 !
2026-09-12 22:20:34 +03:00
Lauri Ojansivu c7c9cbaecb Record Macedonian card and checklist translation repairs
Thanks to xet7 !
2026-09-12 22:20:07 +03:00
Lauri Ojansivu 7e0ce1e473 Repair Macedonian card and checklist control translations
Correct 25 reviewed values, restoring kanban meaning in assignee, card, checklist and planning controls. Preserve exact source tokens and verify repair behavior.

Thanks to xet7 !
2026-09-12 22:19:53 +03:00
Lauri Ojansivu 637702e375 Record Macedonian board scheduling translation repairs
Thanks to xet7 !
2026-09-12 22:19:28 +03:00
Lauri Ojansivu f33aff4ed2 Repair Macedonian board scheduling and background labels
Correct 15 reviewed values. Restore board backup, migration, visibility and settings meanings while preserving placeholders and strong markup.

Thanks to xet7 !
2026-09-12 22:19:14 +03:00
Lauri Ojansivu e80ab9eb99 Record Macedonian storage and workspace translation repairs
Thanks to xet7 !
2026-09-12 22:18:52 +03:00
Lauri Ojansivu b00c7da308 Repair Macedonian attachment storage and workspace translations
Correct 25 reviewed values. Restore source meanings for logged-in users, workspace editing, URL schemes and inactive accounts while preserving storage identifiers and placeholders.

Thanks to xet7 !
2026-09-12 22:18:38 +03:00
Lauri Ojansivu 2f3c44bd90 Record Macedonian date and administration translation repairs
Thanks to xet7 !
2026-09-12 22:18:06 +03:00
Lauri Ojansivu 719ffbd7a4 Repair Macedonian dates custom fields and administration labels
Correct 25 reviewed values. Restore active/inactive account meaning instead of payroll wording, and verify actual rendering of all four date activity types.

Thanks to xet7 !
2026-09-12 22:17:51 +03:00
Lauri Ojansivu cb8acbe6c2 Record Macedonian import and checklist activity repairs
Thanks to xet7 !
2026-09-12 22:17:19 +03:00
Lauri Ojansivu 08d622a8b5 Repair Macedonian imports moves and checklist activity messages
Correct 20 reviewed values. Verify first-reminder meaning, undoing checklist completion and actual due-date/card sprintf rendering.

Thanks to xet7 !
2026-09-12 22:17:06 +03:00
Lauri Ojansivu 9b7068f8ad Verify Macedonian rendering and record date activity translation repairs
Thanks to xet7 !
2026-09-12 22:16:31 +03:00
Lauri Ojansivu 538b8aca6c Repair Macedonian date archive and member activity messages
Replace 20 Serbian- and Bulgarian-seeded values with Macedonian wording while preserving source placeholders and activity meanings.

Thanks to xet7 !
2026-09-12 22:16:08 +03:00
Lauri Ojansivu f3532d47fb Record Macedonian account and accessibility translation repairs
Thanks to xet7 !
2026-09-12 22:15:41 +03:00
Lauri Ojansivu f351a8a18c Repair Macedonian account protection and accessibility translations
Correct 24 reviewed values and retain one valid reactivity-mode label. Preserve source tokens, runtime identifiers and verify exact correction/review values.

Thanks to xet7 !
2026-09-12 22:15:29 +03:00
Lauri Ojansivu 46dc872888 Record Macedonian rule and memory translation repairs
Thanks to xet7 !
2026-09-12 22:14:53 +03:00
Lauri Ojansivu 47924c0f42 Repair Macedonian rule and memory statistic translations
Correct 25 Bulgarian- and Serbian-seeded values. Check V8 metric meanings against official Node documentation and preserve source tokens and technical identifiers.

Thanks to xet7 !
2026-09-12 22:14:39 +03:00
Lauri Ojansivu ef328d8e06 Record Macedonian activity translation repair progress
Thanks to xet7 !
2026-09-12 22:14:01 +03:00
Lauri Ojansivu 83277d852f Repair Bulgarian-seeded Macedonian activity translations
Correct 22 reviewed values, including list and swimlane labels. Restore checklist removal meaning while preserving source placeholders and verifying exact repair values and JSON ordering.

Thanks to xet7 !
2026-09-12 22:13:49 +03:00
Lauri Ojansivu 077d995e9c Record completed German audit queues and regression coverage
Thanks to xet7 !
2026-09-12 22:13:06 +03:00
Lauri Ojansivu fc1026c821 Finish German translation audit with SMTP compound spelling and technical review
Correct four SMTP subject compounds and retain four individually reviewed valid soft WIP labels. Verify exact correction and review values; all four German audit queues are resolved.

Thanks to xet7 !
2026-09-12 22:12:51 +03:00
Lauri Ojansivu 05a70ccc94 Record completion of the Slovak translation audit queue
Thanks to xet7 !
2026-09-12 22:12:21 +03:00
Lauri Ojansivu bd9043aa87 Finish all audited Slovak translation repairs
Correct 59 remaining values and individually retain three valid strings. Verify calendar labels, rules, exact filter examples, troubleshooting commands and zero pending Slovak audit findings.

Thanks to xet7 !
2026-09-12 22:12:06 +03:00
Lauri Ojansivu 68b3192180 Record Slovak list and notification translation repairs
Thanks to xet7 !
2026-09-12 22:10:56 +03:00
Lauri Ojansivu 550883b83a Repair Slovak list archive notification and visibility text
Correct 35 reviewed Czech-seeded values, preserving source placeholders and link markup. Verify vocabulary, exact values, key order and repair behavior.

Thanks to xet7 !
2026-09-12 22:10:44 +03:00
Lauri Ojansivu 435b96ae4f Record Slovak search operator and import repairs
Thanks to xet7 !
2026-09-12 22:10:10 +03:00
Lauri Ojansivu c9ec4bb6a5 Repair Slovak search operators and import instructions
Correct 25 reviewed values. Distinguish members and assignees, end dates and due dates, while preserving literal query syntax and vendor menu labels.

Thanks to xet7 !
2026-09-12 22:09:57 +03:00
Lauri Ojansivu 2949333e14 Record Slovak search translation repairs and remaining audit count
Thanks to xet7 !
2026-09-12 22:09:14 +03:00
Lauri Ojansivu bc71d89915 Repair Slovak search help and case-insensitive search meaning
Correct 20 reviewed values. Preserve query operators and examples while restoring Boolean explanations and the source meaning that text searches ignore letter case.

Thanks to xet7 !
2026-09-12 22:09:01 +03:00
Lauri Ojansivu b4ba7bfafb Record Slovak invitation and administration translation repairs
Thanks to xet7 !
2026-09-12 22:08:17 +03:00
Lauri Ojansivu d0e89cb3ec Repair Slovak invitations permissions and administration text
Correct 43 reviewed values and retain two valid template-variable hints. Preserve exact source placeholders and verify native wording with the translation repair and review suites.

Thanks to xet7 !
2026-09-12 22:08:04 +03:00
Lauri Ojansivu 8467ef0321 Record Slovak archive and card translation repairs
Thanks to xet7 !
2026-09-12 22:07:18 +03:00
Lauri Ojansivu af8df7608b Repair Slovak archive warnings and card controls
Correct 38 Czech-seeded values while retaining two individually reviewed Azure instructions. Verify JSON example fields, template placeholders, separator entities and deletion warnings.

Thanks to xet7 !
2026-09-12 22:07:05 +03:00
Lauri Ojansivu f5f900c0ab Record Slovak checklist and date translation repair progress
Thanks to xet7 !
2026-09-12 22:06:16 +03:00
Lauri Ojansivu 27256c3482 Repair Slovak checklist activities and date messages
Correct 34 Czech-seeded strings and individually retain the valid reactivity mode label. Verify checklist action meanings and real sprintf date/card argument order.

Thanks to xet7 !
2026-09-12 22:06:04 +03:00
Lauri Ojansivu 19244800da Record Slovak translation repair batch and remaining audit count
Thanks to xet7 !
2026-09-12 22:05:10 +03:00
Lauri Ojansivu d9ac5a56f7 Repair Czech-seeded Slovak activity and account translations
Preserve source placeholders while restoring Slovak wording in the first reviewed activity and account-setting batch.

Thanks to xet7 !
2026-09-12 22:04:58 +03:00
Lauri Ojansivu 1fef71d449 Record filter-help translation repairs and completed locale queues
Thanks to xet7 !
2026-09-12 22:04:24 +03:00
Lauri Ojansivu 2832477b78 Translate remaining audited filter help in Arabic Lithuanian Mongolian and Greek
Replace English advanced-filter prose in seven locale files while preserving exact executable examples and escapes. Translate Arabic Trello instructions while retaining literal vendor menu names. Verify all seven audit queues are resolved.

Thanks to xet7 !
2026-09-12 22:04:10 +03:00
Lauri Ojansivu ff380d9c6d Record calendar translation fixes and unchanged-value review progress
Thanks to xet7 !
2026-09-12 22:03:07 +03:00
Lauri Ojansivu 7c1f9cc5a9 Repair Hijri variant labels and retain reviewed examples and protocol names
Translate 37 calendar labels in 21 locale files, preserving Portuguese regional spelling. Individually retain 38 valid comma-separated placeholder examples and DDP labels. Verify terminology, actual template usage, exact review values and audit progress; register browser coverage.

Thanks to xet7 !
2026-09-12 22:02:52 +03:00
Lauri Ojansivu f54a69bac3 Record completion of Romanian audit queues and remaining repair count
Thanks to xet7 !
2026-09-12 22:01:09 +03:00
Lauri Ojansivu 0432fb50a1 Finish audited Romanian translation repairs in both locales
Replace Italian seed wording and English help prose in invitations, imports, permissions, search, administration and archive controls. Preserve query syntax, JSON fields and sprintf argument order. Translate both remaining Hijri variants and register browser coverage.

Thanks to xet7 !
2026-09-12 22:00:53 +03:00
Lauri Ojansivu aa7d7407e4 Record Romanian translation repairs and current audit progress
Thanks to xet7 !
2026-09-12 21:56:36 +03:00
Lauri Ojansivu 9c974f0340 Repair Italian-seeded Romanian activity messages and kanban labels
Restore Romanian wording for account protection, activity messages, archive actions and board settings in both Romanian locales. Preserve interpolation tokens and verify real sprintf rendering without the stray subtask digit.

Thanks to xet7 !
2026-09-12 21:56:21 +03:00
Lauri Ojansivu 69c1577b12 Record completed Latvian and Danish repairs and reproducible remaining audit counts 2026-09-12 21:52:54 +03:00
Lauri Ojansivu ad8c1170db Finish Danish audit review and localize remaining calendar variants 2026-09-12 21:52:20 +03:00
Lauri Ojansivu 9631ff40d7 Repair all audited Latvian wording and track every outstanding audit key 2026-09-12 21:50:59 +03:00
Lauri Ojansivu 84dffeab59 Record translation repair progress and explicit force upload workflow 2026-09-12 21:40:09 +03:00
Lauri Ojansivu 5290ee7271 Add force upload of all local translations with missing-language registration and failure reports 2026-09-12 21:39:43 +03:00
Lauri Ojansivu a194b9741b Translate remaining audited Russian search and administration text into Mongolian 2026-09-12 21:39:43 +03:00
Lauri Ojansivu 6988a01bd6 Replace audited Russian seed wording with Mongolian translations 2026-09-12 21:34:53 +03:00
Lauri Ojansivu 685bf2bcfb Record translation correction batches, dates and remaining audit work 2026-09-12 21:34:00 +03:00
Lauri Ojansivu a2639d3195 Replace audited Persian seed translations in Arabic locales 2026-09-12 21:33:39 +03:00
Lauri Ojansivu 45618108fe Record dated translation audit fixes and their commit 2026-09-12 21:32:19 +03:00
Lauri Ojansivu 7a23353acf Correct audited JSON examples, kanban terms and calendar translations 2026-09-12 21:32:06 +03:00
Lauri Ojansivu 228d7e8f1d Document combined date popup calendar heading 2026-09-12 21:26:36 +03:00
Lauri Ojansivu 9fda12cdd6 Show formatted date beside month in date popup heading 2026-09-12 21:26:29 +03:00
Lauri Ojansivu 8060782e0a Categorize translation pull audit and screen all local language values 2026-09-12 21:21:43 +03:00
Lauri Ojansivu 66643e6aa5 Document date popup movement and calendar button styling 2026-09-12 21:21:29 +03:00
Lauri Ojansivu 3988ab5eab Allow dragging date popups and theme calendar buttons 2026-09-12 21:21:16 +03:00
Lauri Ojansivu 224dded118 Document audit of uncommitted Transifex translation regressions 2026-09-12 21:07:53 +03:00
Lauri Ojansivu b3e7a9d4c0 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-12 21:01:42 +03:00
Lauri Ojansivu 94afc030c7 Record date popup fit and resize verification 2026-09-12 21:01:42 +03:00
Lauri Ojansivu 398d5f42d4 Fit date controls without nested scrolling and add popup resizing
Remove nested date popup height limits and excess spacing, keep the popup within the viewport and add a bottom-right resize handle. Capture pointer drags so resizing cannot close the popup and support arrow-key resizing with content and viewport limits. Extend documentation and regression coverage.

Thanks to xet7 !
2026-09-12 21:01:42 +03:00
Lauri Ojansivu 81bfd3fe68 Record direct calendar popup layout and verification 2026-09-12 21:01:41 +03:00
Lauri Ojansivu 236676ff53 Show a full-width calendar directly in date popups
Keep the selected calendar grid visible on opening and after selecting a day, including for Gregorian dates. Stack popup fields, size day buttons within their cells and show only hour/minute dropdowns while retaining the hidden combined value for existing save handlers. Update documentation and popup regressions.

Thanks to xet7 !
2026-09-12 21:01:41 +03:00
Lauri Ojansivu 724d475cca Document calendar controls and regression coverage in upcoming release 2026-09-12 21:01:41 +03:00
Lauri Ojansivu 5057a0a2c1 Add member-selected calendars and accessible date and time controls
Apply the selected calendar to shared date displays, calendar month views and date inputs. Provide mouse and keyboard date navigation and hour/minute selection while preserving native date storage. Document the supported offline calendars and add display, picker and browser regressions.

Thanks to mimZD and xet7 !
2026-09-12 21:01:41 +03:00
Lauri Ojansivu 590899c0bf Document the on-premise OAuth2 domain restriction.
Thanks to xet7 !
2026-09-12 21:01:41 +03:00
Lauri Ojansivu 2fd461fa55 Add on-premise OAuth2 email domain restrictions.
Check the provider email before account and membership changes. Document the roadmap export validation and remaining source review.

Thanks to xet7 !
2026-09-12 21:01:40 +03:00
github-actions[bot] f2d7faf4da Bump versions for v11.72 2026-09-11 20:31:23 +00:00
Lauri Ojansivu 5004e03547 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-11 23:28:45 +03:00
Lauri Ojansivu 240582657b Prepare v11.72 release 2026-09-11 23:28:44 +03:00
Lauri Ojansivu 259c00d4fb Document the board JSON export fix 2026-09-11 23:28:44 +03:00
Lauri Ojansivu 49eaade957 Fix board JSON exports containing HTML card text
Use a Node-compatible HTML sanitizer so both attachment modes complete instead of throwing at the first HTML-bearing card. Abort partial HTTP transfers on failure and cover complete JSON, attachment bytes and browser downloads.

Thanks to xet7 !
2026-09-11 23:28:44 +03:00
Lauri Ojansivu 612003c272 Merge pull request #6689 from wekan/copilot/fix-release-all-yml-workflow
Harden release-all build-amd64 against read-only bundle package.json
2026-09-11 22:54:13 +03:00
copilot-swe-agent[bot]andxet7 05fbb6847b Fix build-amd64 node-gyp rewrite permission in release workflow
Co-authored-by: xet7 <15545+xet7@users.noreply.github.com>
2026-09-11 19:43:26 +00:00
github-actions[bot] 3eae053fe0 Bump versions for v11.71 2026-09-11 19:37:03 +00:00
Lauri Ojansivu 7d94ff63f1 Prepare v11.71 release 2026-09-11 22:35:53 +03:00
Lauri Ojansivu 48d9439666 Updated translations. 2026-09-11 22:26:34 +03:00
Lauri Ojansivu 7123ac1d0f Updated translations.
Pulled from Transifex and merged per key. Correct-language translations
were kept (af, az, be, bg, ca, ca_ES, cmn, cs, cy, el, fy, hr, it, ro, sr,
tlh, ug, wa-RR, yi, the en-* variants and others). Wrong-language values
were rejected and the previous correct-language value restored: Indonesian
in Acehnese (ace: Leubeh, Teuks, Sambongan seuemah, Hana nyang geutanyong,
Hana label, Jitôh uroe nyoe, Batai); Persian in Arabic (ar, ar-DZ, ar-EG:
due-today and no-assignee, plus the same strings already sitting in
filter-due-today and filter-no-assignee); Modern Standard Arabic and
Persian in Moroccan Darija (ary: كتر, كل نهار, كل سيمانة, كل شهر, and the
Darija no-assignee); Spanish in Asturian (ast-ES: Testu, Ensin asignar,
Ensin etiqueta, Encaboxar), Valencian (ca@valencia: Text lliure) and
Esperanto (eo: Nuligi); a garbled Turkmen cancel (tk_TM: Ýatyr); Latin
script in the Arabic-script Uzbek locale (uz-AR). Rewritten, low
confidence: Breton no-assignee "Den ebet deverket" (French replaced),
Veps cancel "Hül'gäta" (Finnish replaced; the old value was Venda),
Darija no-label "ماكاينش علامة" and due-today "خاصو اليوم". Kept but
noted: Occitan "Tornar" and Italian "Cancella" for cancel are the right
language with a doubtful meaning. A guard test pins the rejected values.

Thanks to translators and xet7 !
2026-09-11 22:07:46 +03:00
Lauri Ojansivu 7ae83fbc67 Update changelog. 2026-09-11 21:54:49 +03:00
Lauri Ojansivu 891eaf360f Update changelog. 2026-09-11 21:54:03 +03:00
Lauri Ojansivu bbe8b40d90 Board View: the default menu order is the order it had before views became orderable.
Thanks to xet7 !
2026-09-11 21:53:50 +03:00
Lauri Ojansivu 859771a10e Card Settings: the default card and minicard field order is the order they had before fields became orderable.
The default of CARD_LAYOUT and MINICARD_LAYOUT - what a board with no
stored cardFieldOrder / minicardFieldOrder renders, and what
applyLayoutOrder() falls back to for the keys a stored order does not
name - is now pinned literally to the render order of cardDetails.jade
and minicard.jade at 59f7d61df, the commit before #4448 made fields
orderable. Reading those templates gives exactly the sequence the layout
module already holds, so no board changes shape; the module, the tests
and the docs now say where that order comes from and a new suite pins
both sequences so a reshuffle cannot pass by reshuffling the template
with it. The two fields newer than that commit stay beside their
closest older neighbour: Text notes in the card's tail, Swimlane name
last on the minicard.

Thanks to xet7 !
2026-09-11 21:53:38 +03:00
Lauri Ojansivu ef52a14907 Update changelog. 2026-09-11 21:52:37 +03:00
Lauri Ojansivu 74f3db87d4 Board Settings: order the menu as Rules ... Move Board to Archive.
The Board Settings menu (boardMenuPopup) is now four groups divided by a
rule, top to bottom:

  Rules, Change color, Change Background Image
  ---
  Board View, Swimlane, List, Card
  ---
  Export, Import, Notifications, Outgoing Webhooks
  ---
  Archived items, Move Board to Archive

Before, Archived items sat second in the first group, Notifications sat
among the colours, and Move Board to Archive was alone at the end. Every
entry keeps the guard it had: Rules, Change color, Change Background Image,
Board View, Swimlane, List, Notifications, Outgoing Webhooks and Move Board
to Archive are board-admin only, Export and Import stay behind withApi /
exportDisabled / canImportIntoBoard, Card stays open to any board member,
Archived items to everyone, and Move Board to Archive stays off the
templates board. No translation keys are added.

Two entries were not in the requested list and are kept where they fit:
Import (js-import-into-board), directly under Export in the third group,
and Archived items (js-open-archives), which is the "Archive" of the list,
opening the fourth group above Move Board to Archive.

tests/boardMenuOrder.test.cjs derives the sequence of entries and rules
from the jade and pins it exactly, pins each entry's guards so a reorder
cannot loosen who sees what, and pins the diagram in
docs/Features/Board/Board-View-Settings.md to the same order.
tests/boardSettingsSwimlaneListCard.test.cjs now expects two rules between
Card and Move Board to Archive, one under each group, and never two in a
row.

Thanks to xet7 !
2026-09-11 21:52:06 +03:00
Lauri Ojansivu 208ee1af96 Update changelog. 2026-09-11 21:32:18 +03:00
Lauri Ojansivu 592d715da9 Update changelog. 2026-09-11 21:31:33 +03:00
Lauri Ojansivu faaa83ed09 Explain and remediate the MongoDB 8.2 crash loop that follows a full disk.
A reported test environment (mongo:8.2.2 in Kubernetes) filled its data
volume: the checkpoint's fdatasync returned ENOSPC, WiredTiger panicked and
mongod aborted - and then it kept failing on every start, with the disk long
since freed. MongoDB 8.2 keeps a throwaway WiredTiger instance under
<dbPath>/_tmp/spilldb for queries that spill to disk and empties it itself on
each start; after the abort that emptying failed ("Failed to clear dbpath of
the internal WiredTiger instance: Directory not empty"), mongod opened the
half-emptied directory, found no version file, reported "Failed to open the
spill WiredTiger instance ... database corruption detected" and fasserted.
Nothing retries, so the pod restarts forever. The data itself is intact;
deleting that one directory is the whole fix.

- snap-src/bin/mongodb-control deletes _tmp/spilldb before every mongod
  start (no mongod is running at that point, and mongod recreates it), and
  its start-failure handler recognises the log line and names the directory.
  The snap ships MongoDB 7 today, so this is a no-op until it does not.
- Admin Panel / Problems: the db.restart row now says what a "No space left
  on device" abort means for a full disk as well as for a network
  filesystem, and both it and db.disk-space name the exact spill directory
  to delete when MongoDB 8.2 will not start afterwards. The probe looks the
  data directory up once and passes it to both rows.
- docs/Databases/MongoDB/Storage-Requirements.md gets the log signature of
  both stages, why the second one never ends, the one command, what must
  not be touched, and that Docker/Kubernetes users run it themselves since
  the database container is MongoDB's own image.
- tests/databaseHealth.test.cjs pins the spill path, both rows' advice, the
  probe wiring, the snap's pre-start deletion (before the first start, after
  the running-instance check, and the only recursive delete apart from the
  existing FerretDB reset) and the documentation.

Thanks to xet7 !
2026-09-11 21:31:10 +03:00
Lauri Ojansivu 921c7f301c Move WIP Limit Groups into Board Settings / Swimlane.
"WIP Limit Groups" was a fourth top-level entry of the Board Settings group,
between List and Card. A group most often caps one swimlane's lists
together, so it is now a row of the Swimlane settings popup: Board Settings
/ Swimlane / WIP Limit Groups. The row opens the unchanged wipLimitGroupsPopup
stacked on the Swimlane popup, so its back arrow returns there. No new
translation keys; the existing wip-limit-groups key is reused.

tests/boardSettingsSwimlaneListCard.test.cjs pins the row in the Swimlane
popup and its single handler, and that the top-level Board Settings list no
longer carries the entry. Docs updated to the new path.

Thanks to xet7 !
2026-09-11 21:31:00 +03:00
Lauri Ojansivu 9c7bd2e7f5 Regenerate the REST API docs for v11.70 after rebasing onto the version bump.
The v11.70 bump regenerated public/api/wekan.yml and wekan.html on origin
while the local REST API commits had regenerated them against v11.67; the
rebase kept the local spec, so it is rebuilt here with the released version
and the new routes together.

Thanks to xet7 !
2026-09-11 21:19:33 +03:00
Lauri Ojansivu b993b0e5a3 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-11 21:19:07 +03:00
Lauri Ojansivu 310b2bca84 Update changelog. 2026-09-11 21:18:35 +03:00
Lauri Ojansivu 15b2b6c533 Board Settings / Card: one "Card field order" heading over two lists, with arrows on every row.
Board Settings / Card was a three-column table (Show on Card, Show on
Minicard, the name) with a separate "Card field order" list of arrows at the
bottom that reordered five sections of the opened card. It is one heading,
"Card field order", over two lists now: "Show on Minicard" in the board's
minicard order and "Show on Card" in its card order, every row of either
`[checkbox] [up] [down] icon label`. The checkbox is whether that side shows
the field, the arrows move it on that side only, and the icon and name are
the field's own. The two lists are independent because the two orders are: a
field can be third on the minicard and last on the card.

models/lib/cardFieldOrder.js is the arithmetic, pure and tested without
Meteor: each surface is a fixed head, reorderable sections of fields, and a
fixed tail. A field moves within its section; at the section's edge it moves
the whole section; a section's header (Labels, Members, Sort number,
Description title) stays first. What is stored is one flat array of field
keys per surface - `cardFieldOrder`, which the first #4448 filled with five
section keys that stay valid and expand to what they rendered (Members
carried Dependencies and Sort, Custom Fields carried Vote/Poker), and the new
`minicardFieldOrder`. Two board setters normalise before storing; the update
allow rule keeps them to a board admin. The REST cardFieldOrder endpoints
still speak in section keys, eight now.

cardDetails.jade renders its eight sections in the board's order and, inside
Labels, Dates, Members, Sort and Vote/Poker, the fields in theirs;
Dependencies and Sort are their own templates. minicard.jade renders every
block under the title through the minicard order, with the dates line and
the badge strip ordering their own fields. Every gate is unchanged.

The popup's rows are a table, models/lib/cardSettingsRows.js, that the
template draws twice, so no row is written out by hand and each checkbox
reads the helper it always read. The tests that looked for a row's class in
the template look in the table now; tests/cardSettingsCoverage.test.cjs
derives each layout's default order from the templates and pins the popup's
shape; tests/cardFieldOrderLayout.test.cjs pins the arithmetic and its
negatives. No new translation keys: the heading and arrow keys already
existed in every locale.

Thanks to xet7 !
2026-09-11 21:18:35 +03:00
Lauri Ojansivu edb07df09d Update changelog. 2026-09-11 21:18:35 +03:00
Lauri Ojansivu c64d3454ac Add REST API for Board Settings / Board View, and OpenAPI blocks for the card settings routes.
GET /api/boards/:boardId/boardViewSettings answers which entries of the
Board View menu a board offers, which one it opens in, separately for a
public and a private board, and the menu order - in the normalised shape the
menu renders with: every view once with both showOnPublic and showOnPrivate
explicit, the two defaults resolved (missing or unknown reads as Swimlanes),
boardViewOrder made whole, and `keys` listing the known views. Board access.

PUT /api/boards/:boardId/boardViewSettings takes any subset of
boardViewSettings, defaultPublicBoardView, defaultPrivateBoardView and
boardViewOrder, through the same pure modifiers the popup's clicks apply
(showBoardViewModifier, defaultBoardViewModifier, normalizeBoardViewOrder),
now composed by boardViewSettingsRequest() in models/lib/boardViewSettings.js:
a default is always shown on its side, hiding a side's current default is a
400 (set another default first - or in the same request, since defaults are
applied before the show flags), an unknown view key anywhere in the body is a
400 and nothing of that request is written, and the order is normalised so the
menu lists every view exactly once. Board admin (or site admin), the same
check as cardFieldOrder. Both answer boardViewSettingsSnapshot().

The existing GET/PUT /api/boards/:boardId/cardSettings routes get the JSDoc
@operation blocks the OpenAPI generator reads (get_board_card_settings,
update_board_card_settings), so the hand-written copy in
openapi/extra_paths.yml - which now duplicated the operationId - is removed.
public/api/wekan.yml and wekan.html are regenerated with the release
workflow's own commands: 158 operations. docs/API/REST-API.md documents both
endpoints with curl examples, and docs/Features/Board/Board-View-Settings.md
links to them.

tests/restApiNewFeatureRoutes.test.cjs pins the four routes to their method,
path, @operation and auth check, that the PUT writes only the helper's $set,
the snapshot's shape, the request helper's positive cases (setting a default
shows it, one request may move the default and hide the old one, the order is
normalised, the input board is not mutated) and negatives (unknown view key in
the order, the settings or a default; hiding a side's default; malformed
bodies; a partly-invalid body applies nothing), and that the generated and the
committed spec carry the four operations exactly once with the old
edit_board_card_settings gone.

Thanks to xet7 !
2026-09-11 21:18:35 +03:00
Lauri Ojansivu d46280505b Update changelog. 2026-09-11 21:18:35 +03:00
Lauri Ojansivu 82646e4bc0 Board Settings / Board View: reorder the Board View menu with up/down arrows.
Each row of the Board View table now carries an up and a down arrow in front
of its name - real links, so the keyboard reaches them, titled with the
existing "Move up" / "Move down" keys of Card Settings' card field order -
and the Board View menu lists its entries in that order for everybody on the
board. Stored per board as boardViewOrder; normalizeBoardViewOrder() drops
unknown keys and duplicates and appends missing views in default order, and
moveBoardView() is a no-op for the first row up, the last row down and an
unknown view, so the menu always lists every view exactly once.

The menu itself is now rendered from the same table as the popup (one
`each boardViewMenuEntries` loop over models/lib/boardViewSettings.js)
instead of 25 static entries, keeping the per-view js-open-<view>-view class
each click handler listens for; the group separators are drawn only while
the order is the default one, since a custom order has no groups.
tests/boardViewMenu.test.cjs's order/icon/label/separator pins read that
table now, the same thing the template reads, and
tests/boardViewSettings.test.cjs pins the arrows, the schema field, the
setter and the normalize/move logic with positive and negative cases.
docs/Features/Board/Board-View-Settings.md describes it.

Thanks to xet7 !
2026-09-11 21:18:35 +03:00
Lauri Ojansivu 67dc46451a Update changelog. 2026-09-11 21:18:35 +03:00
Lauri Ojansivu 7b6e174767 Update changelog. 2026-09-11 21:18:35 +03:00
Lauri Ojansivu bbcd98d9d8 Add REST API for attachment soft delete and restore, Admin Panel Problems, OAuth login provider and passwordless settings, card field order and pausing a rule.
Every feature of the recent releases that had a UI but no endpoint, on the
same server-side code the UI uses:

- DELETE /api/boards/:boardId/attachments/:attachmentId soft-deletes,
  POST .../attachments/:attachmentId/restore restores, and
  GET /api/boards/:boardId/attachments/deleted lists what is restorable -
  all through the attachments.softDelete / attachments.restore methods the
  card and the card history use, run as the request's user. No hard delete.
- GET /api/admin/problems (the Problems status overview plus the new-problem
  count per stream), GET /api/admin/problems/:stream (one page, with
  limit/skip/search) and POST /api/admin/problems/:stream/acknowledge,
  through the admin-only eventLog* methods the Admin Panel pages call.
- GET /api/admin/oauth-providers, PUT /api/admin/oauth-providers/:providerKey
  and PUT /api/admin/passwordless, through saveOauthProviderSettings,
  savePasswordlessSettings and getOauthProviderConfigSources. A provider's
  secret is reported only as { source, hasValue }, never its value.
- GET/PUT /api/boards/:boardId/cardFieldOrder, normalised with the same
  applyCardFieldOrder() the card renders with.
- PUT /api/boards/:boardId/rules/:ruleId accepts `enabled` to pause and
  resume a rule, and GET reports it.

The OpenAPI generator is fixed on the way: server/models/boards.js has had a
bare `catch {` since v11.67, the esprima parser cannot read that, and a parse
failure was silently skipped - so public/api/wekan.yml has shipped WITHOUT
the whole Boards API since then. It now downlevels `catch {` and
`for await (`, warns when a file cannot be parsed, and no longer emits an
empty sub-schema for a primitive array-element marker such as
`wipLimitGroups.$.listIds.$`, which made the spec unparseable YAML.
public/api/wekan.yml and wekan.html are regenerated with the release
workflow's own commands: 156 operations, up from 122.

tests/restApiNewFeatureRoutes.test.cjs pins every new route to its method,
path, @operation block and authentication check, that the OAuth endpoints
never mention a secret outside the input whitelist, the generator's two
fixes, that the generated and the committed spec carry the Boards API and the
new operations, and - as the negative sweep - that no route in models/ or
server/models/ lacks an authentication check.

Thanks to xet7 !
2026-09-11 21:18:35 +03:00
Lauri Ojansivu c23e300cff Update changelog. 2026-09-11 21:17:34 +03:00
Lauri Ojansivu 349c7490e7 Board Settings / Board View: which views a public or private board offers, and which one it opens in.
A new "Board View" entry at the top of Board Settings, above Swimlane, opens
a table like Card Settings: one row per entry of the Board View menu, in the
menu's order, with the columns Default on Public Board, Show on Public Board,
Default on Private Board, Show on Private Board and Description. The Default
columns are radio groups drawn as checkboxes (one default per side, and
setting one also shows it; the default's Show box cannot be un-ticked), and
the two public columns are not rendered when Admin Panel / Settings /
Visibility hides public boards.

The Board View menu lists only the views ticked for the board's current
visibility, and Utils.boardView() resolves the stored choice through the
board, falling back to that side's default, so nobody is left on a hidden
view. Stored per board as boardViewSettings, defaultPublicBoardView and
defaultPrivateBoardView; the decisions are the pure module
models/lib/boardViewSettings.js, applied by the Board setters
setBoardViewShown and setDefaultBoardView, guarded by the existing
board-admin allow rule. The schema fields, setters and popup template were
swept into 148f8a2aa by the Card Settings commit made from the same checkout;
this commit carries the rest.

Four new column-header keys, translated in every locale (low confidence for
the languages without a WeKan translator: Cherokee, Inuktitut, Klingon,
Volapük, Wolaytta, Bambara, Ewe, Fulah, Nahuatl and the other small ones).
docs/Features/Board/Board-View-Settings.md describes the design; tests/
boardViewSettings.test.cjs pins it, and boardSettingsSwimlaneListCard's
hr/gate guards now anchor on the group's new first entry.

Thanks to xet7 !
2026-09-11 21:17:34 +03:00
Lauri Ojansivu 525bcab1bb Update changelog. 2026-09-11 21:17:34 +03:00
Lauri Ojansivu 9702130100 Board Settings / Card: a toggle for every card section and minicard badge, in card order.
Flowtime, Pomodoro, Stickers and Location shipped without an allows* board
toggle, so they rendered on every card and Card Settings had no way to hide
them. Dependencies, Vote, Planning Poker, Text Notes and the activity history
on the opened card had the same gap, as did the dependencies, stickers,
comment-count, vote and poker badges on the minicard.

Each now has a Boards field (default true, so an existing board keeps showing
what it showed), a setter, a REST card-setting key, a healed true-default in
the schema upgrade, a row in Board Settings / Card with its click handler,
and a gate in cardDetails.jade / minicard.jade. allowsActivities already
existed but gated nothing and its row was commented out; it is wired now.

The rows of the popup are in the order the fields appear on the opened card
(Mark complete, number, cover; then the reorderable sections through the
same orderedCardFieldSections source the card renders from, so a board's own
order applies to both; then checklists ... comments, activities), with the
minicard-only rows beside the card row they belong with. No new i18n keys:
every row reuses the field's existing name.

tests/cardSettingsCoverage.test.cjs derives the card's order from the
template and pins the popup to it, checks every gate has a row and every new
row is read, and that none of the four sections is unconditional.

Thanks to rmb82 and xet7 !

Fixes #6688.
2026-09-11 21:17:34 +03:00
Lauri Ojansivu 82154b4c1b Update changelog. 2026-09-11 21:17:34 +03:00
Lauri Ojansivu 55bf153b21 Translate the attachment soft-delete confirmation for Acehnese, Afrikaans, Akan, Amharic, Aragonese, Arabic, Moroccan Arabic, Assamese, Asturian, Aymara, Azerbaijani, Bashkir, Belarusian, Bulgarian, Bhojpuri, Bislama, Bambara, Bengali, Tibetan, Breton, Bosnian, Buryat, Catalan, Valencian, Cherokee, Central Kurdish, Mandarin, Corsican, Czech, Kashubian, Chuvash and Welsh.
Fills the `attachment-soft-delete-pop` placeholder in 40 locale files
(ace, af, af_ZA, ak, am, an, ar, ar-DZ, ar-EG, ary, as, ast-ES, ay, az,
az-AZ, az-LA, ba, be, bg, bho, bi, bm, bn, bo, br, bs, bua, ca,
ca@valencia, ca_ES, chr, ckb, cmn, co, cs, cs-CZ, csb, cv, cy, cy-GB),
reusing each file's existing "attachments", "restore", "card" and
"history" vocabulary.

Low confidence: Acehnese, Akan, Aymara, Bislama, Bambara, Tibetan,
Buryat, Cherokee, Kashubian and Chuvash were written from dictionaries
and the locale's existing strings; a speaker's correction on Transifex
will replace them.

Thanks to xet7 !
2026-09-11 21:17:34 +03:00
Lauri Ojansivu 8e261b24f0 Update changelog. 2026-09-11 21:17:34 +03:00
Lauri Ojansivu 4af000601e Update changelog. 2026-09-11 21:17:34 +03:00
Lauri Ojansivu 73e476e93a Translate the attachment soft-delete confirmation for Lithuanian, Latvian, Maithili, Malagasy, Māori, Macedonian, Malayalam, Mongolian, Marathi, Malay, Maltese, Burmese, Nahuatl, Neapolitan, Norwegian Bokmål, Ndebele, Nepali, Dutch, Northern Sotho, Chichewa, Occitan, Oromo, Odia, Punjabi, Papiamento, Polish, Pashto, Portuguese, Quechua, Romansh, Kirundi and Romanian.
Fills the attachment-soft-delete-pop placeholder in 39 locale files
(lt, lv, mai, mg, mi, mk, ml, mn, mr, ms, ms-MY, mt, my, nah, nap, nb,
nd, ne, nl, nl-NL, nso, ny, oc, om, or_IN, pa, pap, pl, pl-PL, ps, pt,
pt-BR, pt-PT, pt_PT, qu, rm, rn, ro, ro-RO), reusing each file's
existing words for attachment, card, file, restore and history.

Low confidence: mai, mg, mi, nah, nap, nd, nso, ny, om, or_IN, pap, qu,
rm and rn were written from dictionaries and the locale's existing
vocabulary; a native speaker should review them on Transifex.

Thanks to xet7 !
2026-09-11 21:17:34 +03:00
Lauri Ojansivu b7cf109848 Update changelog. 2026-09-11 21:17:34 +03:00
Lauri Ojansivu 7f2d644e28 Translate the attachment soft-delete confirmation for Ukrainian, Urdu, Uzbek, Venetian, Veps, Venda, Vietnamese, Flemish, Volapük, Waray, Walloon, Wolaytta, Wolof, Wu, Xhosa, Yiddish, Yoruba, Cantonese, Tamazight, Chinese and Zulu.
Fills the attachment-soft-delete-pop placeholder in the 34 locale files
uk-UA, uk, ur, uz-AR, uz-LA, uz-UZ, uz, ve-CC, ve-PP, ve, vi-VN, vi,
vl-SS, vo, wa-RR, wa, wal, wo, wuu-Hans, xh, yi, yo, yue_CN, zgh,
zh-CN, zh-GB, zh-HK, zh-Hans, zh-Hant, zh-TW, zh, zh_SG, zu-ZA and zu,
reusing each file's existing words for attachment, card, edit, restore
and history.

Low confidence: Venetian (ve-CC), Veps (ve-PP), Venda (ve), Volapük (vo),
Walloon (wa), Wolaytta (wal), Wolof (wo) and Tamazight (zgh, written in
Latin script like the file's other recent strings). uz-AR is written in
Latin Uzbek because the whole file is, matching its existing test.

Thanks to xet7 !
2026-09-11 21:17:34 +03:00
Lauri Ojansivu aa2ff7a8a2 Translate the attachment soft-delete confirmation for Russian, Aromanian, Kinyarwanda, Sakha, Sardinian, Sicilian, Sindhi, Northern Sami, Sinhala, Slovak, Slovenian, Samoan, Shona, Somali, Albanian, Serbian, Swati, Sotho, Swedish, Swahili, Silesian, Tamil, Telugu, Tajik, Thai, Tigrinya, Tigre, Turkmen, Tagalog, Klingon, Tswana, Tongan, Tok Pisin, Turkish, Tsonga, Tatar and Uyghur.
Fills the "attachment-soft-delete-pop" English placeholder in the locales
ru-UA, ru, ru_RU, rup, rw, sah, sc, scn, sd, se, si, sk, sl, sl_SI, sm, sn,
so, sq, sr, ss, st, sv, sw, szl, ta, te-IN, tg, th, ti, tig, tk_TM, tl, tlh,
tn, to, tpi, tr, ts, tt and ug, reusing each file's existing words for
attachment, card, history and restore.

Low confidence: rup, sah, se, sm, sn, ss, st, ti, tig, tlh, tn, to, tpi and
ts were written from dictionaries and the locale's existing vocabulary and
should be corrected by a speaker.

Thanks to xet7 !
2026-09-11 21:17:33 +03:00
Lauri Ojansivu f6eeb18b75 Translate the attachment soft-delete confirmation for Gujarati, Manx, Hausa, Hawaiian, Hebrew, Hindi, Croatian, Upper Sorbian, Haitian Creole, Hungarian, Armenian, Indonesian, Igbo, Icelandic, Italian, Inuktitut, Japanese, Javanese, Georgian, Kazakh, Greenlandic, Khmer, Kannada, Korean, Konkani, Kashmiri, Kurdish, Cornish, Kyrgyz, Latin, Luxembourgish, Luganda and Ladin.
The new key attachment-soft-delete-pop, added as an English placeholder in
5a09dca40, is now translated in these 39 locale files (gu-IN, gv, ha, haw,
he-IL, he, hi-IN, hi, hr, hsb, ht, hu, hy, id, ig, is, it, iu, ja-HI, ja-JP,
ja, jv, ka, kk, kl, km, km_KH, kn, ko-KR, ko, kok, ks, ku, kw, ky, la, lb,
lg, lld), reusing each file's existing words for attachment, card, history
and restore.

Low confidence, written from dictionaries and the file's own vocabulary:
Manx (gv), Hawaiian (haw), Inuktitut (iu), Greenlandic (kl), Kashmiri (ks),
Cornish (kw), Luganda (lg), Ladin (lld) and Upper Sorbian (hsb).

Thanks to xet7 !
2026-09-11 21:17:33 +03:00
Lauri Ojansivu 1815d97f30 Translate the attachment soft-delete confirmation for Danish, German, Dzongkha, Ewe, Greek, Esperanto, Spanish, Estonian, Basque, Persian, Fula, Finnish, Fijian, Faroese, French, Friulian, Frisian, Irish, Scottish Gaelic, Galician and Guarani.
Fills the attachment-soft-delete-pop placeholder in the da, de (+ de-AT,
de-CH, de_DE), dz, ee, el (+ el-GR), eo, es (+ es-AR, es-CL, es-CO, es-LA,
es-MX, es-PE, es-PY, es_CO), et-EE, eu, fa (+ fa-IR), ff, fi, fj, fo,
fr (+ fr-BE, fr-CA, fr-CH, fr-FR), fur, fy (+ fy-NL), ga, gd, gl (+ gl-ES)
and gn locales, reusing each file's existing card / attachment / history /
restore vocabulary.

Low confidence: dz, ee, ff, fj, gn (written from the locale's existing
terms and dictionaries; a native speaker should review), and to a lesser
degree fur, gd and fo.

Thanks to xet7 !
2026-09-11 21:17:33 +03:00
Lauri Ojansivu 66f9c0202d Update changelog.
Thanks to xet7 !
2026-09-11 21:17:33 +03:00
Lauri Ojansivu dce2898382 Attachments: soft delete on the card, restore from the card history, hard delete only with the archived board.
Delete on an attachment used to remove the document and its file at once.
It is now the 'attachments.softDelete' method (History.md section 12): the
document gets deletedAt/deletedBy/deleteBatchId with the same helpers lists
use, the file is kept, and the card's cover is unset if this was it. Every
card-facing read - the opened card's gallery and "Attachments (N)" count,
the minicard paperclip badge, the slideshow, the cover, the board-background
picker, My Attachments, the API list endpoints and the exporters - filters
to live attachments with liveAttachments(); the publications keep sending
the deleted ones so the card history can reach them.

The card history records who deleted it and when, with the filename in the
row. Restore - the table's selection + Restore, or the row's own Restore
button, both through changeHistory.restore and applyAttachmentContent -
clears the mark, so the card, its count and the minicard badge include the
attachment again; the cover is never re-set. An attachment row previews
with the existing attachmentViewer slideshow and downloads with the same
link the gallery draws, and never offers cover or background. Uploads and
renames are recorded through the existing history hooks.

There is no per-attachment hard delete any more: api.attachment.delete,
DELETE /api/attachment/delete/:id and removeBoardBackground soft-delete,
permanentlyDeleteAttachmentFromFilesReport and the Files report's delete
button are gone, Attachments.allow remove and onBeforeRemove refuse every
client remove and log the attempt under Admin Panel / Problems. The one
hard delete is Admin Panel / Problems / Delete enabled, board archived,
board deleted from the archive: boardRemover now removes every attachment
of the board, live and soft-deleted, with its file.

One new i18n key, attachment-soft-delete-pop, replaces the "permanent, no
undo" confirmation text; it is inserted in English into every locale at
the same position for translation.

Thanks to xet7 !
2026-09-11 21:17:33 +03:00
Lauri Ojansivu b1f37e6dc0 CHANGELOG: note the node-gyp fix for the Windows release legs.
Opens the next Upcoming section above v11.70 with the entry for
037975a9d, under a "The release workflow" group: what the v11.70 run's
Windows jobs said, why the Visual Studio 2026 runner image broke Meteor's
node-gyp 10.2.0 pin, and what bump-bundle-node-gyp.mjs does about it. Also
records which of that run's other failures were the runner's (snapcraft LXD
timeouts, the Launchpad riscv64 job cap) rather than the repository's.

Thanks to xet7 !
2026-09-11 21:17:33 +03:00
Lauri Ojansivu 0001d09a8d Fix the Windows release legs: raise the bundle's node-gyp so it can see Visual Studio 2026.
build-win64 and build-win-arm64 both failed the v11.70 release run
(GitHub Actions run 93730167566) in "Rebuild native modules for Windows",
inside `npm install` in bundle/programs/server, while argon2's install
script compiled it:

    gyp info using node-gyp@10.2.0
    gyp ERR! find VS unknown version "undefined" found at
      "C:\Program Files\Microsoft Visual Studio\18\Enterprise"
    gyp ERR! find VS could not find a version of Visual Studio 2017 or newer to use
    gyp ERR! stack Error: Could not find any Visual Studio installation to use

Why. On 2026-09-07 GitHub's `windows-latest` became the
`windows-2025-vs2026` image (runner image 20260907.229.1), which carries
Visual Studio 18 (2026) and no longer 17 (2022). The node-gyp that compiles
is not one this repository installs: Meteor's bundler writes
programs/server/package.json with `"node-gyp"` pinned to the copy inside
the Meteor tool - 10.2.0 in Meteor 3.5.2 - and that version knows the major
versions 15, 16 and 17 and nothing newer. The shrinkwrap beside it does not
list node-gyp at all, so the pin is the only thing `npm install` consults.
argon2 always compiles on Windows: the amd64 bundle's win32-x64 prebuild is
there, but node-gyp-build's `node-gyp-build-test` probe runs through the
Linux-made `.bin/` shims, which are not `.cmd` files, so the probe fails and
it falls through to `node-gyp rebuild`. With Visual Studio 2022 that worked;
with 2026 and node-gyp 10 it cannot.

What changed. releases/bump-bundle-node-gyp.mjs raises an exact node-gyp pin
below 13.0.2 in a built bundle's programs/server/package.json (12.1.0 added
Visual Studio 2026 support; 13.0.1/13.0.2 fixed its version detection,
nodejs/node-gyp#3338; 13.0.2's engines accept the Node.js 24 the runners
use). It runs ONCE, in build-amd64's "Install server npm modules" step
BEFORE the first `npm install`, because every other architecture - the
Windows legs, arm64, the extra arches - reinstalls programs/server from that
same package.json, so one rewrite travels to all of them. A pin already at
or above the minimum, a range, or a bundle without a pin is left as it is,
so a Meteor release that ships a newer node-gyp keeps its own.
releases/build-release-bundle.sh does the same before its install, so a
local release bundle is what a release ships.

tests/bumpBundleNodeGyp.test.cjs pins the script's decisions (bump, keep,
no pin, dry run, unreadable, read-only), that the minimum is a node-gyp
with the Visual Studio 2026 fix, that release-all.yml runs it in the amd64
install step before `npm install` and nowhere else, and (negative) that no
workflow leg hard-codes node-gyp 10.2.0 or a GYP_MSVS_VERSION workaround.
tests/buildScriptParity.test.cjs lists the script with its bundle-time
siblings.

Not fixable from here, in the same run: the three amd64 snap jobs died in
snapcraft's LXD base-instance creation (`apt-get install -y snapd` timed
out after 600 s; the arm64 twins passed), and snap-launchpad riscv64 was
still building on Launchpad when the job cap cancelled it.

Thanks to xet7 !
2026-09-11 21:17:32 +03:00
Lauri Ojansivu 9a32261811 Design: attachments are soft-deleted, restored from card history, and hard-deleted only with the archived board.
History.md gains section 12 and closes the section 11 question about restoring
a removed attachment: delete on a card is a soft delete that keeps the file and
unsets the cover, the card, its count and the minicard badge hide it, the card
history shows who deleted it and restores it with the same preview and download
controls as the card but never cover or background, no per-attachment hard
delete exists anywhere, and the one hard delete is Admin Panel / Problems /
Delete enabled, board archived, board deleted from the archive.

Thanks to xet7 !
2026-09-11 21:17:32 +03:00
github-actions[bot] 9d75895707 Bump versions for v11.70 2026-09-11 12:50:08 +00:00
Lauri Ojansivu 222f05c9cd Prepare v11.70 release 2026-09-11 15:49:00 +03:00
Lauri Ojansivu da81693999 CHANGELOG: note the OpenAPI generator fix for the release bump job. 2026-09-11 13:17:23 +03:00
Lauri Ojansivu cfaf71d22e Fix the release bump job: the generated OpenAPI spec was not valid YAML.
The bump job of release-all.yml (.tools/wekan13, run 93672173482)
regenerates public/api/wekan.yml with openapi/generate_openapi.py and then
renders it with @redocly/cli, which stopped the release with
"Error: bad indentation of a mapping entry in public/api/wekan.yml
(1232:2)". A @param whose description continues on the next JSDoc lines -
models/exportCharts.js's chartKey, "one of dashboard, burndown, ...
controlChart, ..." - was emitted under `description: |` with only its
FIRST line indented; the continuation lines landed at column 1, which is
no longer inside the block scalar, so the whole spec failed to parse.
print_openapi_param now indents every line of the description.

The same job warned "unknown type object / allowed values: string,
number, boolean, integer, array, file" four times for the rules API's
trigger/action params. OpenAPI 2.0 has no `object` for a path/query/form
parameter; those are now emitted as `type: string` / `format: json`
(the REST API takes them as JSON in a string), and `object` no longer
warns.

Reproduced locally (PyYAML: "expected <block end>, but found '<scalar>'
... line 1232, column 2"); after the fix the spec parses and
`npx @redocly/cli build-docs` - the exact step that failed - renders it.
tests/openapiParamMultiline.test.cjs pins the emitter and, where python3
with PyYAML is available (it is in CI), parses the regenerated spec.

Thanks to xet7 !
2026-09-11 13:16:47 +03:00
Lauri Ojansivu bd11ff64ea CHANGELOG: add the OAuth-provider and passwordless login translation entries.
Thanks to xet7 !
2026-09-11 12:24:38 +03:00
Lauri Ojansivu 3cdd33437d Translate the OAuth-provider and passwordless login strings for the remaining languages.
Fills the 17 new OAuth-provider / passwordless strings in the last 53
locale files: Akan, Amharic, Aymara, Bislama, Bambara, Buryat, Cherokee,
Ewe, Fulah, Fijian, Guarani, Hausa, Hawaiian, Haitian Creole, Igbo,
Inuktitut, Greenlandic, Cornish, Luganda, Malagasy, Maori, Nahuatl,
Northern Ndebele, Northern Sotho, Chichewa, Oromo, Papiamento, Quechua,
Kirundi, Kinyarwanda, Samoan, Shona, Somali, Swati, Southern Sotho,
Swahili, Tigrinya, Tigre, Tswana, Tongan, Tok Pisin, Tsonga, Venda,
Venetian, Veps, Flemish, Wolaytta, Wolof, Xhosa, Yoruba, Zulu and
Klingon. With this every non-English locale has all 24 keys translated
and `fill-translations.mjs --missing` reports no language with
untranslated strings.

The Venetian and Veps files were seeded with Spanish and Finnish and the
Klingon file with German; the new strings are written in the language the
locale tag names. Low confidence: the Cherokee, Inuktitut, Nahuatl,
Aymara, Quechua, Buryat, Veps, Wolaytta, Tigre, Fulah and Klingon strings
were written from dictionaries and the files' own existing vocabulary and
would benefit from a native speaker's review.

Thanks to xet7 !
2026-09-11 12:24:07 +03:00
Lauri Ojansivu 8537f78511 Translate the OAuth-provider and passwordless login strings for South and Southeast Asian languages.
Fills the 17 new OAuth-provider / passwordless strings in 29 more locale
files: Assamese, Bhojpuri, Tibetan, Dzongkha, Gujarati, Kannada, Konkani,
Kashmiri, Khmer, Malayalam, Maithili, Marathi, Burmese, Nepali, Odia,
Punjabi, Pashto, Sindhi, Sinhala, Tamil, Telugu, Urdu, Central Kurdish,
Kurmanji Kurdish, Cantonese, Javanese, Acehnese and Tagalog. The provider
names stay in Latin script, as those files already write Google and
GitHub, and %s and the environment-variable names are copied verbatim.

Low confidence: the Tibetan, Dzongkha, Kashmiri, Konkani, Maithili,
Bhojpuri and Acehnese strings were written from dictionaries and the
files' own existing vocabulary and would benefit from a native speaker's
review.

Thanks to xet7 !
2026-09-11 12:12:53 +03:00
Lauri Ojansivu 24e5ee4cac Translate the OAuth-provider and passwordless login strings for European and Central-Asian languages.
Fills the 17 new OAuth-provider / passwordless strings in 62 more locale
files: Afrikaans, Aragonese, Asturian, Azerbaijani, Bashkir, Belarusian,
Bosnian, Breton, Corsican, Kashubian, Chuvash, Welsh, Esperanto, Faroese,
Friulian, Frisian, Irish, Scottish Gaelic, Manx, Upper Sorbian, Armenian,
Icelandic, Georgian, Kazakh, Kyrgyz, Latin, Luxembourgish, Ladin,
Macedonian, Mongolian, Maltese, Neapolitan, Occitan, Romansh, Aromanian,
Sakha, Sardinian, Sicilian, Northern Sami, Albanian, Silesian, Tajik,
Turkmen, Tatar, Uyghur, Uzbek, Volapük, Walloon, Yiddish and Standard
Moroccan Tamazight, plus their regional variants and the Algerian,
Egyptian and Moroccan Arabic files, which take the Arabic strings.

Macedonian and Mongolian were seeded with Bulgarian and Russian vocabulary;
the new strings are written in the language the locale tag names, as the
translation policy requires. Low confidence: Ladin, Aromanian, Kashubian,
Manx, Sakha, Chuvash, Bashkir, Volapük, Walloon and the Tifinagh Tamazight
strings were written from dictionaries and the files' own existing
vocabulary and would benefit from a native speaker's review.

Thanks to xet7 !
2026-09-11 12:02:39 +03:00
Lauri Ojansivu 89a125bef2 CHANGELOG: add the Meteor accounts login providers and passwordless entry.
Thanks to xet7 !
2026-09-11 11:52:39 +03:00
Lauri Ojansivu 83d2a7fc75 Add Google, GitHub, Facebook, X, Meteor Developer, Weibo, Meetup and passwordless login.
Meteor's own accounts packages - accounts-google, accounts-github,
accounts-facebook, accounts-twitter, accounts-meteor-developer,
accounts-weibo, accounts-meetup and accounts-passwordless - are added, so
every way to log in that Meteor's accounts system offers is available.

models/lib/oauthProviders.js is the pure catalog of the seven providers
(env var names, ServiceConfiguration id field, login method, icon, label
key) with the decisions built on it: OAUTH_<PROVIDER>_ENABLED plus id and
secret (each also read from a <NAME>_FILE Docker secret), the Admin Panel
override winning over the env var, OAUTH_PROVIDERS_LOGIN_STYLE,
OAUTH_PROVIDERS_MERGE_EXISTING_USERS and PASSWORDLESS_ENABLED.

server/lib/oauthProviders.js writes ServiceConfiguration for every enabled
provider at startup and on demand (reconfigureOauthProviders, called by the
Admin Panel after a save) and removes it for a disabled one, so switching a
provider off takes effect without a restart. A first login through a
provider becomes a WeKan user the way OIDC does, fail-closed: an existing
account of another login method is only linked when merging is on and the
provider verified the address, otherwise the login is refused and the
attempt recorded on the new oauth.account-conflict canary for Admin Panel
-> Problems. Passwordless is gated on both the token-request method and
the login attempt while it is off.

getAuthenticationsEnabled reports each enabled provider key and
passwordless, and the login form shows one button per provider and a
two-step e-mailed-code form under the SAML button, with errors in the same
region as the password form. No credential ever reaches the client.

tests/oauthProviders.test.cjs covers the catalog, the env/_FILE/admin
resolution, the enabled and takeover decisions, the ServiceConfiguration
upsert/remove, the canary, the login form and the no-secret-on-the-client
negative checks.

Thanks to xet7 !
2026-09-11 11:52:04 +03:00
Lauri Ojansivu c1ebd4204f CHANGELOG: add the platform settings and docs entry for the login providers.
Thanks to xet7 !
2026-09-11 11:51:08 +03:00
Lauri Ojansivu 24260c497b Translate the OAuth-provider and passwordless login strings for the major languages.
Fills the 17 translatable strings of the new OAuth-provider / passwordless
keys in the 45 most-used languages and their 43 regional variants: German,
French, Spanish, Italian, Portuguese (European and Brazilian), Dutch,
Polish, Russian, Ukrainian, Czech, Slovak, Finnish, Swedish, Danish,
Norwegian Bokmål, Hungarian, Romanian, Bulgarian, Greek, Turkish, Arabic,
Hebrew, Persian, Hindi, Bengali, Indonesian, Malay, Vietnamese, Thai,
Japanese, Korean, Chinese (Simplified and Traditional), Catalan, Galician,
Basque, Estonian, Lithuanian, Latvian, Slovenian, Croatian and Serbian.
The provider names Google, GitHub, Facebook, X (Twitter), Meteor Developer,
Weibo and Meetup stay in Latin script, as every locale file already writes
Google and GitHub; %s and the MAIL_URL, PASSWORDLESS_ENABLED and
OAUTH_*_ENABLED names are copied verbatim. Written with the fill tool,
which only ever writes into English placeholders.

Thanks to xet7 !
2026-09-11 11:51:04 +03:00
Lauri Ojansivu 61806605fc Add the Meteor accounts login providers and passwordless login to every platform's settings.
OAUTH_GOOGLE_*, OAUTH_GITHUB_*, OAUTH_FACEBOOK_*, OAUTH_TWITTER_*,
OAUTH_METEOR_DEVELOPER_*, OAUTH_WEIBO_*, OAUTH_MEETUP_*,
OAUTH_PROVIDERS_LOGIN_STYLE, OAUTH_PROVIDERS_MERGE_EXISTING_USERS and
PASSWORDLESS_ENABLED are now documented, commented out or defaulted, in
every place the OAUTH2_* and SAML_* settings already are: docker-compose.yml
and its FerretDB v1 / v2 and MongoDB variants, the Dockerfiles' ENV block,
start-wekan.sh, start-wekan.bat, the Snap config (keys list plus
DESCRIPTION_/DEFAULT_/KEY_ triples) and wekan-help, the Sandstorm package
definition, the stacksmith Docker-secrets reader and secrets/README.md.
The comments name the callback URL to register at each provider,
<ROOT_URL>/_oauth/<service>, and say that Admin Panel / People / Login
overrides the environment.

New docs pages docs/Features/Login/OAuth-Providers.md and Passwordless.md,
linked from the docs index. tests/oauthProvidersPlatformEnv.test.cjs pins
that every variable is present on every platform and that the docs exist
and are linked.

Thanks to xet7 !
2026-09-11 11:50:30 +03:00
Lauri Ojansivu 19eb60c37a CHANGELOG: add the Admin Panel OAuth-provider and passwordless override entry.
Thanks to xet7 !
2026-09-11 11:50:21 +03:00
Lauri Ojansivu d1b5d0a75c Admin Panel: override the OAuth login provider and passwordless env vars.
Admin Panel / People / Login gets a section for Meteor's own accounts-*
login services (Google, GitHub, Facebook, X/Twitter, Meteor Developer, Weibo,
Meetup) and for passwordless login, built the same way as the LDAP section:
every OAUTH_<PROVIDER>_ENABLED / _CLIENT_ID / _SECRET env var, the shared
OAUTH_PROVIDERS_LOGIN_STYLE and OAUTH_PROVIDERS_MERGE_EXISTING_USERS, and
PASSWORDLESS_ENABLED can be set there, a value set in the Admin Panel wins
over the env var, and a badge beside each field names the source in effect.

The secret is stored in Settings.oauthProviders.<key>.secret and, like the
LDAP bind password, is never published: only the boolean secretSet is, an
empty secret submission leaves the stored one untouched, and the sources
method reports it through hasConfigValue() only. saveOauthProviderSettings
validates the provider key against the catalog and both save methods call
reconfigureOauthProviders() so a change takes effect without a restart.

Tests: tests/oauthProvidersAdminOverride.test.cjs, and the whole-tree secret
sweep in tests/ldapAdminOverrideSecurity.test.cjs now also matches
hyphenated sub-document keys.

Thanks to xet7 !
2026-09-11 11:49:48 +03:00
Lauri Ojansivu 1ac7ddfad2 Add the OAuth-provider and passwordless login i18n keys.
Adds 24 keys after "ldap-test-connection-error" in en.i18n.json and every
other locale file, with the English source as the value for now: the Admin
Panel section for the Google, GitHub, Facebook, X (Twitter), Meteor
Developer, Weibo and Meetup OAuth providers, the "Sign in with %s" button,
and the passwordless one-time email code login. The seven provider names
are proper nouns, so fill-translations.mjs now treats them as invariant
values that legitimately stay identical in Latin-script locales; the
translations of the other strings follow in separate commits.

Thanks to xet7 !
2026-09-11 11:44:02 +03:00
Lauri Ojansivu b1b6e6c234 Prepare v11.69 release 2026-09-11 11:28:42 +03:00
Lauri Ojansivu e5092c87e8 Move the card_comment_reactions indexes into the collection bootstrap.
server/models/collectionBootstrap.js already owned this collection's index
(the unique cardCommentId one); 03ffb56a5 added a second module for the
same collection. One place per collection: the cardId and boardId indexes
now sit beside the existing one there, and the separate module is gone.
tests/cardCommentReactionsIndexes.test.cjs pins that arrangement.

Thanks to xet7 !
2026-09-11 11:27:17 +03:00
Lauri Ojansivu 6bf36b72ac CHANGELOG: note the database health reporting and the card_comment_reactions index. 2026-09-11 11:25:18 +03:00
Lauri Ojansivu 4a09551397 Report database health in Admin Panel / Problems, and fix a missing index automatically.
The reported crash series (.tools/crash) was invisible from inside WeKan:
MongoDB aborting on every checkpoint, restarting, aborting again, with
every query in between slow - and the admin found it in the container log.
Admin Panel / Problems / Database problems now gets a row for each thing
WeKan can measure from its side of the socket, from a probe that runs 30 s
after startup and every five minutes (server/lib/databaseHealth.js, the
pure decisions in models/lib/databaseHealth.js):

- db.restart: serverStatus.uptime went down while WeKan kept running - the
  database process restarted; points at the fatal-assertion/fsync cause and
  the storage page.
- db.network-filesystem: getCmdLineOpts' dbPath, when it is a directory
  this process can see (snap, embedded database, shared volume), is on a
  CIFS/SMB, NFS or FUSE filesystem (fs.statfs f_type).
- db.slow-storage: serverStatus.opLatencies reads averaged over 100 ms
  across the interval, on a real number of reads - the storage latency
  behind the "Slow query" lines.
- db.disk-space: dbStats fsUsedSize/fsTotalSize below 5% or 512 MiB free -
  the real "no space left on device", before it happens.
- db.index-created: the one remediation WeKan can do itself. ensureIndex
  (server/lib/mongoStartup.js) now reports an index it created on a
  collection that already held documents - until then every query on it
  was a collection scan - as found and fixed; a new, empty collection
  getting its indexes at first start stays silent.

All rows go through the existing `database` stream (recordDatabaseHealth in
server/lib/databaseProblems.js: same shape, same per-minute quieting per
type), so they land on the same page as what the database itself says.
FerretDB answers only some of these commands; each step is independent and
what it cannot answer is skipped. Nothing here can throw into startup or
sits on a request path.

tests/databaseHealth.test.cjs drives every decision (including the
reported case: 519 MB used, 10 GiB free is NOT a space problem) and pins
the wiring.

Thanks to xet7 !
2026-09-11 11:23:53 +03:00
Lauri Ojansivu 03ffb56a5e Index card_comment_reactions, and document why MongoDB's data directory must be local.
From a reported MongoDB crash series (.tools/crash: WeKan and MongoDB in one
Kubernetes pod, the database volume on an SMB/DFS share):

- The crash itself is WiredTiger's checkpoint fsync() returning ENOSPC
  ("No space left on device" with 519 MB used and 10 GiB free) on the
  network share, followed by a fatal assertion and abort - every checkpoint,
  so a restart loop. That is the storage, not WeKan: MongoDB requires a
  local filesystem with real fsync semantics under its data directory.
  docs/Databases/MongoDB/Storage-Requirements.md now says so, shows what
  the log looks like when it is not, and what to do (local block volume;
  attachments may still live on a share; MONGO_URL over TCP is fine).
- The WeKan-side finding in the same logs: card_comment_reactions had no
  index at all, and every board open queried it by `cardId: { $in: [...] }`
  and by `boardId` as a full collection scan - 3,397 COLLSCANs of that one
  collection in the last crash log, up to 1.6 s each, the bulk of its
  "Slow query" lines. server/models/cardCommentReactions.js now ensures
  indexes on cardId, boardId and cardCommentId at startup, like every other
  per-card collection.

tests/cardCommentReactionsIndexes.test.cjs pins both.

Thanks to xet7 !
2026-09-11 11:23:53 +03:00
Lauri Ojansivu a50ddc52b2 CHANGELOG: restructure Upcoming per CLAUDE.md and link every commit since v11.68.
The section had grown by appending a subsection per batch of work - five
"adds ...", two "fixes the following bug(s)", three developer-tooling and
two "closes the following already-fixed issue" subsections in
chronological order. They are now one subsection per kind, in the
documented order: CodeQL security fixes, new features, bug fixes,
developer tooling, documentation, closed already-fixed issues,
translations - the same-kind subsections merged, the one-off "adds a
GDPR-friendlier alternative" / "adds Sign in with Apple" / "adds REST API
improvements" subsections folded into the features list as topic groups,
and every merged subsection fully grouped.

47 commits since the v11.68 release had no entry at all (the CodeQL
negative-test rewrite, the Jade build fixes, the document-preview 415
fixes, the "Remove all labels" rule action, checklist automatic reset,
in-place rule editing, card-to-new-board, the Bigboard view registration,
a dozen regression-test additions and guard updates, two docs pages, two
TODO Later updates and nine translation/i18n-key commits); each is linked
now under its kind.

Thanks to xet7 !
2026-09-11 11:15:16 +03:00
Lauri Ojansivu 47bbbcf066 Updated translations. 2026-09-11 11:15:08 +03:00
Lauri Ojansivu ead5578e85 Close CodeQL alerts #534, #535 and #536: the negative tests carried the flagged shapes.
The three alerts under .tools/wekansec19 point at tests, not application
code: the negative tests added with 9cbf67ba7 (which fixed the real
occurrences of these three patterns) reproduce each OLD bug so they can
prove it is gone - and did so with the exact construct CodeQL flags, so
the alerts stayed open on the test lines:

- tests/cardUrlAutolink.test.cjs:200 (js/incomplete-sanitization, #536):
  the ']'-only escaping is now reproduced with split/join instead of a
  ']'-only regex replace.
- tests/oauthLogoutUrl.test.cjs:101
  (js/incomplete-url-substring-sanitization, #535): the naive `includes`
  check now assembles the hostname at run time instead of a literal.
- tests/boardCreationAdminOnly.test.cjs:129 (js/identity-replacement,
  #534): the "replace a space with a space" no-op now builds its RegExp at
  run time instead of the literal /\ /g.

Each test still asserts the same old-vs-new difference; only the way the
old behaviour is written changed. No application code was affected, so no
security-log entry applies.

Thanks to GitHub CodeQL and xet7 !
2026-09-11 11:08:15 +03:00
Lauri Ojansivu b70f52ef19 CHANGELOG: note the Roles status table TAPi18n import fix. 2026-09-11 11:05:58 +03:00
Lauri Ojansivu 48106ee17e Fix "Exception in Template.rolesGeneral rolesStatusTable": TAPi18n never imported.
Reported directly: Admin Panel / People / Roles threw from its status
table's column value functions, which call TAPi18n.__() in
client/components/settings/peopleBody.js - a file that never imported
TAPi18n (a named export of /imports/i18n, not a global). Sweeping the tree
for the same shape found it in two more files that would fail the same way
the moment their TAPi18n call ran: client/components/settings/
lockedUsersBody.js (the unlock confirmation) and client/components/boards/
multiboardCalendarView.js (its calendar locale and labels).

tests/clientSingletonImports.test.cjs now sweeps for TAPi18n too, beside
Utils and ReactiveCache.

Thanks to xet7 !
2026-09-11 11:05:42 +03:00
Lauri Ojansivu 75fd2bef2f CHANGELOG: note the Rules Workflow view toggle fix. 2026-09-11 11:00:37 +03:00
Lauri Ojansivu ad3554bbcc Show the Rules Workflow view when it is selected from another tab.
Reported directly, with screenshots: on Board Settings / Rules, clicking
"Workflow view" in the page sidebar changed the button's label to "List
view" but the page kept showing the "Add trigger" tab - the workflow
builder never appeared.

rulesMain.jade renders +rulesWorkflow only while its rulesCurrentTab
ReactiveVar is 'rulesList'. The toggle lives in rulesControls, a separate
template in the page sidebar with no handle on the rulesMain instance, so
it only flips Session 'rulesViewMode'; from the Add trigger / Add action /
rule details tabs that changed nothing visible. rulesMain now owns an
autorun that brings the page back to the list tab whenever the workflow
view is selected - the one place the tab state can be changed from.

tests/rulesWorkflowViewToggle.test.cjs pins it.

Thanks to xet7 !
2026-09-11 11:00:23 +03:00
Lauri Ojansivu 8526e062cb CHANGELOG: note the chart PDF table rows and Excel date-cell fixes. 2026-09-11 10:49:57 +03:00
Lauri Ojansivu 278db0ada3 Write dates as real date cells in every Excel export.
Reported directly, with a LibreOffice screenshot: the Frappe Gantt view's
Excel export showed Start/Due/End as ISO text ("2026-09-23T09:00:00.000Z").
ExporterChartExcel wrote cell.toISOString() into the cell. A date is now a
real date cell with a date number format (yyyy-mm-dd hh:mm), so the
spreadsheet shows it in its own date format, sorts it as a date and can do
arithmetic on it; the "-" placeholder for an unset date stays text. Every
chart export (Gantt, Time, the report charts) shares this exporter.

The follow-up ask - every other Excel export too:
- The board and card Excel exports draw the shared card document
  (models/lib/cardDocument.js), whose meta pairs were pre-formatted text
  (fmtDate), so Created/Received/Start/Due/End/Last activity were text
  there as well. A date pair now carries the raw Date as a third element
  ([label, text, Date]); renderCardDocumentExcel writes that as a date cell
  and the PDF keeps printing the text. ExporterExcelBoard's own
  Created/Modified lines get the same treatment.
- The legacy whole-board Excel export (ExporterExcel.js) already wrote Date
  values into numFmt columns; nothing to change, pinned as such.

tests/chartExcelDateCells.test.cjs drives the chart row-writing branch
against a stand-in worksheet and pins the other exporters' shapes;
tests/pdfExport.test.cjs updated for add()'s third argument.

Thanks to xet7 !
2026-09-11 10:49:27 +03:00
Lauri Ojansivu e487f8d913 Keep each chart PDF export row on one line, in fixed columns.
Reported directly: in the Frappe Gantt view's PDF export a row's text was
not on one line. ExporterChartPDF wrote every header and data row as ONE
text line - "title  |  start  |  due  |  end" - with no width limit, so a
long card title pushed the dates off the page edge in the Unicode PDF and
past the line in the base-font fallback, and nothing lined up from row to
row.

New models/lib/pdfDocument.js tableRow(): a row with fixed column widths
(the name column twice the others), a cell that does not fit clipped with
an ellipsis rather than wrapped, so a row is always exactly one line.
buildUnicodePdf draws it as measured cells (PDFKit width + ellipsis); the
base-font fallback gets the same row as padded monospaced runs within the
text width. ExporterChartPDF uses it for the header (grey bar, bold) and
every row of every chart export - Gantt, Time and the report charts share
this exporter.

tests/chartPdfTableRows.test.cjs pins the one-line/aligned-columns/clipping
behaviour and that the exporter no longer joins rows into unbounded text.

Thanks to xet7 !
2026-09-11 10:42:40 +03:00
Lauri Ojansivu 1c8732575a CHANGELOG: note the Frappe Gantt view-mode translations for Ukrainian, Urdu, Uzbek, Venetian, Veps, Venda, Vietnamese, Flemish, Volapük, Waray, Walloon, Wolaytta, Wolof, Wu, Xhosa, Yiddish, Yoruba, Cantonese, Tamazight, Chinese and Zulu.
Thanks to xet7 !
2026-09-11 10:31:41 +03:00
Lauri Ojansivu 8e423ccb37 CHANGELOG: note the Frappe Gantt view-mode translations for Russian, Aromanian, Kinyarwanda, Yakut, Sardinian, Sicilian, Sindhi, Northern Sami, Sinhala, Slovak, Slovenian, Samoan, Shona, Somali, Albanian, Serbian, Swati, Sotho, Swedish, Swahili, Silesian, Tamil, Telugu, Tajik, Thai, Tigrinya, Tigre, Turkmen, Tagalog, Klingon, Tswana, Tongan, Tok Pisin, Turkish, Tsonga, Tatar and Uyghur. 2026-09-11 10:31:28 +03:00
Lauri Ojansivu aac7657e1d Translate the Frappe Gantt view-mode strings for Ukrainian, Urdu, Uzbek, Venetian, Veps, Venda, Vietnamese, Flemish, Volapük, Waray, Walloon, Wolaytta, Wolof, Wu, Xhosa, Yiddish, Yoruba, Cantonese, Tamazight, Chinese and Zulu.
Fill the five gantt-view-* keys (hour, quarter day, half day, year and the
"Mode" dropdown placeholder) in the last translation batch, uk-UA through zu,
using each locale's existing day/week/month/hour vocabulary as reference.

Low confidence: Veps (ve-PP), Venda (ve), Volapük (vo), Waray (wa-RR),
Walloon (wa), Wolaytta (wal), Wolof (wo), Tamazight (zgh, kept in the Latin
Tamazight the file already uses) and Yoruba (yo). uz-AR keeps the Latin-script
Uzbek its file and test already pin.

Thanks to xet7 !
2026-09-11 10:31:21 +03:00
Lauri Ojansivu ebb6874e27 CHANGELOG: note the Frappe Gantt view-mode translations for Gujarati, Manx, Hausa, Hawaiian, Hebrew, Hindi, Croatian, Upper Sorbian, Haitian Creole, Hungarian, Armenian, Indonesian, Igbo, Icelandic, Italian, Inuktitut, Japanese, Javanese, Georgian, Kazakh, Greenlandic, Khmer, Kannada, Korean, Konkani, Kashmiri, Kurdish, Cornish, Kyrgyz, Latin, Luxembourgish, Luganda and Ladin. 2026-09-11 10:31:17 +03:00
Lauri Ojansivu 4bb68ceda0 Translate the Frappe Gantt view-mode strings for Russian, Aromanian, Kinyarwanda, Yakut, Sardinian, Sicilian, Sindhi, Northern Sami, Sinhala, Slovak, Slovenian, Samoan, Shona, Somali, Albanian, Serbian, Swati, Sotho, Swedish, Swahili, Silesian, Tamil, Telugu, Tajik, Thai, Tigrinya, Tigre, Turkmen, Tagalog, Klingon, Tswana, Tongan, Tok Pisin, Turkish, Tsonga, Tatar and Uyghur.
Fill the five gantt-view-* placeholders (hour, quarter day, half day, year
and the view-mode dropdown placeholder) in 40 locale files, written from
each language's existing day/week/month/hours strings and its calendar
vocabulary. "Mode" is rendered as "view mode" in every language so the
value differs from the English placeholder.

Low confidence: rup (Aromanian), sah (Yakut), se (Northern Sami), sm
(Samoan), sn (Shona), ss (Swati), tig (Tigre), tlh (Klingon), to (Tongan),
tpi (Tok Pisin), ts (Tsonga), and the Bantu quarter-day phrases (rw, st,
tn, ts, ss).

Thanks to xet7 !
2026-09-11 10:31:12 +03:00
Lauri Ojansivu 9cbb62be86 CHANGELOG: note the Frappe Gantt view-mode translations for Danish, German, Dzongkha, Ewe, Greek, Esperanto, Spanish, Estonian, Basque, Persian, Fula, Finnish, Fijian, Faroese, French, Friulian, Frisian, Irish, Scottish Gaelic, Galician and Guarani. 2026-09-11 10:31:10 +03:00
Lauri Ojansivu 87f2fa12b4 Translate the Frappe Gantt view-mode strings for Gujarati, Manx, Hausa, Hawaiian, Hebrew, Hindi, Croatian, Upper Sorbian, Haitian Creole, Hungarian, Armenian, Indonesian, Igbo, Icelandic, Italian, Inuktitut, Japanese, Javanese, Georgian, Kazakh, Greenlandic, Khmer, Kannada, Korean, Konkani, Kashmiri, Kurdish, Cornish, Kyrgyz, Latin, Luxembourgish, Luganda and Ladin.
Fill the five gantt-view-* placeholders (Hour, Quarter Day, Half Day, Year,
Mode) that were added in English for every locale, using each language's
existing day/week/month/hours terms as the reference. "Mode" is rendered as
"view mode" in each language, since the dropdown placeholder reads "view mode".

Low confidence: Manx (gv), Hausa (ha), Hawaiian (haw), Upper Sorbian (hsb),
Igbo (ig), Inuktitut (iu), Greenlandic (kl), Kashmiri (ks), Cornish (kw),
Luganda (lg) and Ladin (lld) - especially the "quarter day" phrase, which
none of these files had an existing pattern for.

Thanks to xet7 !
2026-09-11 10:31:01 +03:00
Lauri Ojansivu d79ce72d93 Translate the Frappe Gantt view-mode strings for Danish, German, Dzongkha, Ewe, Greek, Esperanto, Spanish, Estonian, Basque, Persian, Fula, Finnish, Fijian, Faroese, French, Friulian, Frisian, Irish, Scottish Gaelic, Galician and Guarani.
Fill the five gantt-view-* keys (Hour, Quarter Day, Half Day, Year and the
"Mode" dropdown placeholder) in 40 locale files: da, de, de-AT, de-CH, de_DE,
dz, ee, el, el-GR, eo, es and its 8 regional variants, et-EE, eu, fa, fa-IR,
ff, fi, fj, fo, fr and its 4 regional variants, fur, fy, fy-NL, ga, gd, gl,
gl-ES and gn. Only English placeholders were written; existing translations
are untouched.

Low confidence: dz (Dzongkha), ee (Ewe), ff (Fula), fj (Fijian) and gn
(Guarani) were written from dictionary vocabulary and each file's existing
day/week/month terms; a native speaker may want to correct them.

Thanks to xet7 !
2026-09-11 10:30:55 +03:00
Lauri Ojansivu 6aba33fc8c CHANGELOG: note the Frappe Gantt view-mode translations for Lithuanian, Latvian, Maithili, Malagasy, Maori, Macedonian, Malayalam, Mongolian, Marathi, Malay, Maltese, Burmese, Nahuatl, Neapolitan, Norwegian Bokmål, Ndebele, Nepali, Dutch, Northern Sotho, Chichewa, Occitan, Oromo, Odia, Punjabi, Papiamento, Polish, Pashto, Portuguese, Quechua, Romansh, Kirundi and Romanian.
Thanks to xet7 !
2026-09-11 10:30:53 +03:00
Lauri Ojansivu d96e8b44cf CHANGELOG: note the Frappe Gantt view-mode translations for Acehnese, Afrikaans, Akan, Amharic, Aragonese, Arabic, Assamese, Asturian, Aymara, Azerbaijani, Bashkir, Belarusian, Bulgarian, Bhojpuri, Bislama, Bambara, Bengali, Tibetan, Breton, Bosnian, Buryat, Catalan, Cherokee, Sorani, Mandarin, Corsican, Czech, Kashubian, Chuvash and Welsh.
Thanks to xet7 !
2026-09-11 10:30:37 +03:00
Lauri Ojansivu 7bdf55434f Translate the Frappe Gantt view-mode strings for Lithuanian, Latvian, Maithili, Malagasy, Maori, Macedonian, Malayalam, Mongolian, Marathi, Malay, Maltese, Burmese, Nahuatl, Neapolitan, Norwegian Bokmal, Ndebele, Nepali, Dutch, Northern Sotho, Chichewa, Occitan, Oromo, Odia, Punjabi, Papiamento, Polish, Pashto, Portuguese, Quechua, Romansh, Kirundi and Romanian.
Fill the five gantt-view-* keys (Hour, Quarter Day, Half Day, Year and the
"Mode" dropdown placeholder) directly, from each locale's existing day, week,
month and hours strings and its calendar vocabulary. Applied through
fill-translations.mjs --apply, so only the English placeholders were written.
"Mode" is rendered as "view mode" in each language so it differs from English.

Low confidence: mai, mg, mi, my, nah, nap, nd, nso, ny, om, qu, rm, rn (words
looked up rather than known), and ps/or_IN spelling. A native speaker can
correct them on Transifex; that correction wins over these fills.

Thanks to xet7 !
2026-09-11 10:30:20 +03:00
Lauri Ojansivu 6faf19872f Translate the Frappe Gantt view-mode strings for Acehnese, Afrikaans, Akan, Amharic, Aragonese, Arabic, Assamese, Asturian, Aymara, Azerbaijani, Bashkir, Belarusian, Bulgarian, Bhojpuri, Bislama, Bambara, Bengali, Tibetan, Breton, Bosnian, Buryat, Catalan, Cherokee, Sorani, Mandarin, Corsican, Czech, Kashubian, Chuvash and Welsh.
Fill the five gantt-view-* keys (Hour, Quarter Day, Half Day, Year and the
"Mode" dropdown placeholder) in the 40 locale files ace, af, af_ZA, ak, am,
an, ar-DZ, ar-EG, ar, ary, as, ast-ES, ay, az-AZ, az-LA, az, ba, be, bg, bho,
bi, bm, bn, bo, br, bs, bua, ca, ca@valencia, ca_ES, chr, ckb, cmn, co,
cs-CZ, cs, csb, cv, cy-GB and cy, using each file's existing day/week/month
vocabulary as the reference. Catalan "Mode" is identical to English, so it
is written as "Mode de vista".

Low confidence: ace, ak, ay, bi, bm, bo, bua, chr, csb and cv.

Thanks to xet7 !
2026-09-11 10:30:17 +03:00
Lauri Ojansivu 58f27590b5 CHANGELOG: note the shared chart Export popup and Frappe Gantt chrome translation. 2026-09-11 10:28:37 +03:00
Lauri Ojansivu 364903fd8e One translated "Export" popup for every chart view; translate Frappe Gantt's chrome.
Reported directly: the Frappe Gantt view (and the DHTMLX Gantt, WeKan Gantt,
Time and the ten report-chart views) each showed two untranslated
"Export to PDF" / "Export to Excel" links. They now share one translated
"Export" button that opens a new exportChartPopup - the same pop-over list
of formats the board/swimlane/list/card export popup uses, offering PDF
and Excel with the same icons and labels. The URL is built in exactly one
place, client/components/boards/charts/exportChart.js's chartExportUrl();
the five per-view copies of that helper (gantt.js, frappeGantt.js,
dhtmlxGantt.js, timeView.js, boardCharts.js) are gone. One delegated click
handler opens the popup with the view's data-chart-key as its data context.
The popup's title, exportChartPopup-title, is added to every locale from
that locale's existing "export" translation - no new words to translate.

Also from the same report: Frappe Gantt's own chrome was English in every
language. Its view-mode dropdown prints each mode's `name` and looks modes
up by it, so it now receives translated copies of Frappe's default modes
(GanttLib.VIEW_MODE) - Day/Week/Month from the existing keys, and four new
keys (gantt-view-hour, -quarter-day, -half-day, -year) added to every
locale as English placeholders to be filled next. Its hardcoded "Today"
button and "Mode" placeholder are rebuilt on every view change, so a
MutationObserver re-translates them (existing "today" key; new
gantt-view-mode), disconnected in onDestroyed.

tests/chartExportPopup.test.cjs pins all of it; boardViewMenu,
reportChartLibraries and timeViewReportAndExport updated from the old
per-view links to the shared button/builder.

Thanks to xet7 !
2026-09-11 10:26:47 +03:00
Lauri Ojansivu a6bc213ea9 CHANGELOG: note the button theming, Dashboard chart and Gantt locale fixes. 2026-09-11 10:16:14 +03:00
Lauri Ojansivu 10c58867a6 Translate the Frappe Gantt and DHTMLX Gantt month and weekday names.
Reported directly: both Gantt board views showed English month names in
every language. Neither library reads WeKan's translations: Frappe Gantt
takes a `language` tag it hands to Intl.DateTimeFormat, and DHTMLX Gantt
takes a locale object and only bundles a fixed set (~40) of them,
defaulting to English.

New client/lib/ganttLocale.js (pure, unit-tested) feeds both:
- intlLocaleFor() maps WeKan's language tag to one Intl accepts - the
  underscore tags ('ru_RU', 'ca_ES', 'zh_SG', ...) make Intl throw
  RangeError, and an unknown tag falls back to its primary subtag, then
  English, so nothing can throw inside a library's render loop. Every tag
  under imports/i18n/data resolves (pinned by the test).
- intlDateNames() builds month_full/month_short/day_full/day_short from
  Intl for any language, in dhtmlx's shape (weeks starting Sunday).
- dhtmlxLocaleFor() uses the locale dhtmlx bundles for the language when
  there is one (it also translates dhtmlx's own labels), and otherwise
  keeps the English labels with the Intl date names.

frappeGantt.js passes `language`; dhtmlxGantt.js calls
gantt.i18n.setLocale() on each reactive run before init/parse so a
language change takes effect. The Frappe view-mode dropdown's own
"Day/Week/Month/Year" labels are the library's and stay as they are.

Thanks to xet7 !
2026-09-11 10:15:44 +03:00
Lauri Ojansivu d0a70473e1 Fix the Dashboard charts never rendering (Template.currentData() in afterFlush).
Reported directly: the Dashboard view showed nothing above its table, with
"Exception from Tracker afterFlush function: Error: There is no current
view" from client/components/boards/charts/boardCharts.js. The chart is
deliberately built inside Tracker.afterFlush so the <canvas> exists by
then, but that callback runs outside every Blaze view, where
Template.currentData() throws - and one such call (the dataset title) sat
inside it, aborting the whole chart build with nothing to retry it.

The data context is now read once in the autorun, before afterFlush, and
only the captured chartKey/titleKey are used inside the callback.
tests/boardChartsAfterFlushContext.test.cjs pins that no afterFlush body
in this file calls Template.currentData()/Template.instance().

Thanks to xet7 !
2026-09-11 10:15:44 +03:00
Lauri Ojansivu 376790de5d Theme the Timeline restore, List "Sync now" and "Test LDAP Connection" buttons.
Reported directly, following the Flowtime "Add Interruption" fix: the
Timeline view's "Restore to this state" button was likewise an unthemed
default button. Searching every jade `button` for the same shape found two
more labelled action buttons from recent features with no theme class:
the List popup's "Sync now" (between a `.primary` Save and a `.negate`
Clear) and Admin Panel / Login's "Test LDAP Connection" (beside a
`.primary` Save). All three now carry `.primary`, like "Start Pomodoro".

Pagination arrows, sort headers, icon-only toggles and the vote/poker
buttons keep their own deliberate styling and were left alone.
tests/actionButtonsUseThemeClass.test.cjs pins the six labelled action
buttons (Flowtime start/interruption, Pomodoro start, and these three).

Thanks to xet7 !
2026-09-11 10:09:26 +03:00
Lauri Ojansivu 98a46fd837 CHANGELOG: note the Flowtime Add Interruption button theme fix. 2026-09-11 10:01:29 +03:00
Lauri Ojansivu aa728a8dce Give the Flowtime "Add Interruption" button the same theme as "Start Pomodoro".
Reported directly: on an opened card, "Add Interruption" rendered as an
unthemed default button next to "Start Pomodoro", which carries the
`.primary` theme class (as do "Start Flow" and every other primary action
button). The interruption button had no theme class at all. Added
`.primary`; tests/flowtimeSession.test.cjs now pins it.

Thanks to xet7 !
2026-09-11 10:01:11 +03:00
Lauri Ojansivu e1d242bfba CHANGELOG: add entry for the card detail section data-context fix. 2026-09-11 00:55:58 +03:00
Lauri Ojansivu 0242f968be Fix the card detail sections losing the card as their data context.
Reported directly: after adding a label to an opened card, clicking it in
the Labels popup no longer made it wider or applied it to the card. It
worked in the previous release.

The reorderable card detail sections (131514d61) are rendered by an `each`
over the board's stored section order. The plain `each
orderedCardFieldSections` form sets the data context of everything inside
it to the current item - the section NAME string ("labels", "dates", ...) -
so every section template, and every popup opened from one, received a
string where it expected the card. Popup.open uses the clicked element's
data context, so the Labels popup's `templateInstance.data` was "labels":
`card.toggleLabel` was undefined and the click handler returned silently,
`isLabelSelected ../_id` looked up `_id` on a string, and the section's own
`each labels` / `each stickers` / `each getLocations` rendered nothing. The
earlier fixes this session (global helpers, missing imports, the sortable
`stop` handler) each removed a real exception on this path but could not
restore the toggle, because the popup still had no card.

Switched the loop to `each section in orderedCardFieldSections`, the form
already used elsewhere in this file, which keeps `this` as the card and
exposes the item as `section`.

tests/cardFieldSectionsKeepCardContext.test.cjs pins the `in` form and that
every branch compares `section`; tests/cardFieldOrder.test.cjs updated to
the new loop text (its intent - the order-driven loop - is unchanged).

Thanks to xet7 !
2026-09-11 00:55:31 +03:00
Lauri Ojansivu f77180bdc6 CHANGELOG: add entry for the label click-to-toggle fix. 2026-09-11 00:34:44 +03:00
Lauri Ojansivu 85a7f0fc8a Fix "card.board is not a function" breaking the label click-to-toggle.
Reported directly: clicking a label in the Labels popup no longer toggled
it onto the card (grow wider/apply on first click, shrink/remove on
second), with the browser console showing "card.board is not a function"
thrown from jQuery UI sortable's stop handler in
client/components/cards/labels.js (the label-reorder drag on
cardLabelsPopup).

jQuery UI's sortable widget runs its `stop` callback on mouseup whenever a
drag was registered, which ordinary mouse/trackpad clicks can trigger even
without an intentional drag - so this handler fires far more often than
"the user actually reordered labels." It resolved the card via
`Blaze.getData(this).board()`, where `this` is the sortable's root
`.edit-labels-pop-over` element; that does not reliably resolve back to a
real Card document with a callable `.board()`, so it threw. An uncaught
exception inside jQuery UI's own `_clear()` cleanup (which is what invokes
this `stop` callback) aborts the rest of that cleanup, consistent with the
toggle-on-click visuals getting stuck even though the click handler itself
runs independently.

The sibling `click .js-select-label` handler two lines below already had
the right fix for the same problem (added for linked-card labels): resolve
the board from the popup TEMPLATE's own data via `getCardLabelBoard(...)`,
never from `Blaze.getData` on a DOM node that may not carry the card
context the popup was actually opened with. Applied the same fix to the
`stop` handler.

tests/labelReorderStopHandler.test.cjs pins the fix and negatively checks
the old Blaze.getData(this) shape can't come back.

Verified against a real Meteor boot (`meteor run`) in-sandbox.

Thanks to xet7 !
2026-09-11 00:34:10 +03:00
Lauri Ojansivu c8fd3f028c CHANGELOG: add entry for the Utils/ReactiveCache missing-import fix. 2026-09-11 00:13:40 +03:00
Lauri Ojansivu 2f626d099d Fix "Utils is not defined"/"ReactiveCache is not defined" in four client files.
Reported directly: clicking a newly created label did not enlarge it or
apply it to the card. The browser console showed "Exception in
Template.cardFlowtime canControlFlow" and the same for
Template.cardPomodoro canControlPomodoro - both call Utils.canModifyCard()
but never import Utils (a plain ES export from client/lib/utils.js, not a
Meteor global), so the helper threw a ReferenceError the moment either
template's reactive computation ran, which broke the surrounding card
render along with it.

Searching the whole tree for the same shape (a client file calling
Utils.<method>() or ReactiveCache.<method>() without importing it) found
two more real, independent instances:
- client/components/settings/notificationSettingsPopup.js's
  currentBoard() called Utils.getCurrentBoardId() unimported.
- client/components/main/bookmarks.js's four helpers/events called
  ReactiveCache.getCurrentUser() unimported - the header bookmarks/Starred
  feature.
- client/lib/tests/Utils.tests.js did `import '../utils';` (a bare
  side-effect import) and then used the bare `Utils` global throughout -
  never actually reached by the fast Node suite (a mocha/browser test),
  but would have thrown the same way if run.

None of this is caught by rspack's build (it does not type-check or
cross-check imports app-wide) or by tests/run-node-suites.cjs (nothing
exercises these code paths with the name deliberately left undefined) -
only the browser, live, the moment that render actually runs.

tests/clientSingletonImports.test.cjs sweeps every client/**/*.js file for
a call to Utils.<method>( or ReactiveCache.<method>( with no matching
import, so this shape cannot reappear anywhere else undetected.

Verified against a real Meteor boot (`meteor run`) in-sandbox.

Thanks to xet7 !
2026-09-11 00:13:10 +03:00
Lauri Ojansivu 6db5ec263f CHANGELOG: add entry for the card-popup isDateFormat helper-scope fix. 2026-09-11 00:00:39 +03:00
Lauri Ojansivu 0c538bb924 Fix "No such function: isDateFormat" and 11 siblings breaking the card popup.
Reported directly: clicking a minicard did not open the card popup, with
the browser console showing "Error: No such function: isDateFormat" from
Template.cardFieldSectionDates. cardDetails.jade was split into several
per-section templates (cardFieldSectionLabels/Dates/Members/
DependenciesAndSort/CustomFields/VoteAndPoker), plus cardDetailsActionsPopup
and activities.jade are separate templates entirely - but twelve helpers
those templates actually call (isDateFormat, canShowCustomFieldsOnCard,
stickers, isWatching, dueDateChangeCount, getLocations, getDependencyCards,
customFieldsGrid, showActivities, showVotingButtons,
showPlanningPokerButtons, currentSwimlaneListsSorted, isCurrentListId) were
only ever registered on Template.cardDetails.helpers - template-local, so
invisible to every template that isn't cardDetails itself. Blaze only
surfaces this the moment that piece of UI actually renders (an
autorun/Tracker throw, not a build error), which is why it passed the
Node test suite and even a `meteor build` cleanly and only broke live.

Moved all twelve to Template.registerHelper (global), matching the
pattern the file already uses for isSectionOpen (this file) and
canModifyCard (client/config/blazeHelpers.js) - both deliberately global
for the same reason. The remaining Template.cardDetails.helpers entries
(orderedCardFieldSections, cardMaximized, cardCollapsed, presentParentTask,
linkForCard, isVerticalScrollbars, isLoaded) are confirmed used only from
cardDetails.jade itself, so they stay template-local.

tests/cardFieldSectionHelperScope.test.cjs pins all twelve as globally
registered and confirms none are shadowed by a stale local copy.
tests/recentIssueRegressions.test.cjs's currentSwimlaneListsSorted
extraction updated for the new registerHelper shape (behavior unchanged).

Verified against a real Meteor boot (`meteor run`) in-sandbox.

Thanks to xet7 !
2026-09-11 00:00:02 +03:00
Lauri Ojansivu bee3e4835f CHANGELOG: add entry for the customFields.sort boot-crash fix. 2026-09-10 23:46:50 +03:00
Lauri Ojansivu 7930da455a Fix a boot-crashing invalid SimpleSchema property on customFields.sort.
The user's own ./build.sh run reproduced it directly: "[uncaughtException]
WeKan is stopping: Error: Invalid definition for sort field: 'decimal' is
not a supported property", thrown from SimpleSchema's own constructor the
moment the server started - before any board could load. `decimal: true`
is not, and has never been, a property SimpleSchema recognizes (its
schemaDefinitionOptions list is autoValue/defaultValue/label/optional/
required/type, plus WeKan's own extendOptions(['index', 'unique']) in
imports/simpleSchema.js); nothing exercises that validation under a plain
Node test, which is why it slipped through review. `type: Number` already
allows fractional values with no extra flag - the same as Lists' own
`sort` field, which this one was deliberately written to mirror (see the
field's own comment) and which never had this property either - so
removing it changes nothing about what the field accepts.

tests/customFieldsSortSchema.test.cjs pins the sort field's definition
against SimpleSchema's actual valid-property list and sweeps every other
file under models/ for the same shape, so it cannot reappear anywhere else
undetected by a Node-only test run.

Verified against a real Meteor boot (`meteor run`) in-sandbox: reproduced
the crash before this commit, starts cleanly after.

Thanks to xet7 !
2026-09-10 23:43:06 +03:00
Lauri Ojansivu c4d26fefc6 CHANGELOG: add entries for the package-boot-crash fix and the Jade warning fix. 2026-09-10 23:35:23 +03:00
Lauri Ojansivu 6e7388e5d8 Fix a Jade whitespace warning in the comment-reply banner.
Two text lines under an if/else in comments.jade's reply banner started
with a mustache tag directly, with no leading `|` marker - the pattern
every other text-content line in the codebase uses. build.sh's dev build
warned "missing space before text" for both; harmless (the build still
compiled), but noise on every build. Added the `|`.
2026-09-10 23:34:25 +03:00
Lauri Ojansivu ccb5c28b76 Fix local Meteor packages importing app-tree code, which crashed the server at boot.
The user's own ./build.sh run reproduced it directly: "Error: Cannot find
module '/models/settings'" thrown from packages/wekan-ldap/server/ldap.js
the moment the compiled server actually started (rspack's own build only
warns about this - node test suites never catch it either, since they run
these files with plain Node, outside Meteor's package linker). A local
package under packages/ is its own isolated build unit and cannot import
an app-tree module by absolute path ('/models/...', '/server/...'), static
or dynamic, import or require - that only resolves by accident, if at all.

Four packages had this shape:
- packages/wekan-ldap/server/ldap.js imported Settings and resolveConfigValue
  from /models/settings and /models/lib/configResolver directly (added by the
  recent LDAP Admin Panel override feature). configResolver's pure functions
  are now vendored into packages/wekan-ldap/server/configResolver.js; Settings
  access is injected instead, via setLdapSettingsAccessor(), wired once at
  boot by the new server/ldapAdminSettingsBridge.js (imported from
  server/imports.js).
- packages/wekan-oidc/oidc_server.js required /models/lib/oauth2ClientSecretJwt
  (pure, Node crypto/fs only) - vendored the same way, into
  packages/wekan-oidc/oauth2ClientSecretJwt.js.
- packages/wekan-accounts-saml/saml_server.js and
  packages/wekan-accounts-cas/cas_server.js each lazily required
  /server/lib/canary inside their account-conflict guard's try/catch, so it
  failed silently (caught, not crashing boot) rather than ever actually
  logging the attempt. canary.js is stateful (Meteor/Mongo-backed rate
  limiting), so it can't be vendored the same way; server/lib/canary.js now
  sets global.__wekanTripCanary once at module load (the Node process itself
  is the one thing both sides can reach without either importing the other),
  and both packages call through that instead.

Also found while wiring this up: packages/wekan-accounts-saml/saml_server.js
imports the npm package body-parser without declaring it in package.js's
Npm.depends, which crashed boot the same way once it stopped finding the
copy some unrelated app dependency happened to hoist into node_modules.
Added it to Npm.depends.

Tests: tests/packageAppImportBoundary.test.cjs sweeps every file under
packages/ for an app-tree absolute import (the negative check - nothing
under packages/ may do this, anywhere) and pins both vendored copies'
behavior against their app-tree originals so they cannot silently drift.
tests/securityAdvisories20260825.test.cjs's CAS account-conflict assertion
updated to match the new global.__wekanTripCanary bridge call.

Verified end to end: bootstrapped Meteor 3.5.2 in-sandbox and ran the real
dev server (`meteor run`) before and after - it reproduced both the
Settings/configResolver crash and, after fixing that, the body-parser
crash, exactly as reported; after this commit it compiles and starts
cleanly with neither.

Thanks to xet7 !
2026-09-10 23:34:20 +03:00
Lauri Ojansivu 21927811a3 CHANGELOG: note translation fill for Akan, Amharic, Aragonese, Assamese, Bhojpuri, Bambara, Cherokee, Central Kurdish, Chuvash, Dzongkha, Ewe, Faroese, Hawaiian, Haitian Creole, Nyanja, Kinyarwanda, Sindhi, Samoan, Somali and Yiddish. 2026-09-10 23:19:57 +03:00
Lauri Ojansivu 6cb4f86773 Translate remaining strings for Akan, Amharic, Aragonese, Assamese, Bhojpuri, Bambara, Cherokee, Central Kurdish, Chuvash, Dzongkha, Ewe, Faroese, Hawaiian, Haitian Creole, Nyanja, Kinyarwanda, Sindhi, Samoan, Somali and Yiddish.
Fills the Roadmap board-view, popup-title, notification-settings and
chart-forecast strings added since these locale files were last
completed. Aragonese also picks up two older admin-people keys
(last-active/currently-online) that were still untranslated.
2026-09-10 23:18:20 +03:00
Lauri Ojansivu b0345fe118 CHANGELOG: note translation fill for ff, fj, fur, gn, om, se, wa-RR, ay, ba, kl, rn, rup, sah, bi, bua, kw, vl-SS. 2026-09-10 23:17:48 +03:00
Lauri Ojansivu 69abcf8a93 Translate remaining strings for ff, fj, fur, gn, om, se, wa-RR, ay, ba, kl, rn, rup, sah, bi, bua, kw, vl-SS.
Fills the ~57-59 placeholder keys added for the Roadmap board view,
Two-Factor Authentication, forecast chart, list sync and related popups
in each of these locales, using each file's own existing translations
and general kanban/dictionary terminology as reference. Placeholders
(__remaining__, __average__, __date__, %s) are preserved unchanged.
Some translations (constructed/lesser-resourced languages such as
Cornish, Sakha, Buryat, Aromanian, Bislama, Kalaallisut) are done with
lower confidence and may need human review.
2026-09-10 23:17:24 +03:00
Lauri Ojansivu 27af126bf1 CHANGELOG: repoint v11.67's two remaining stale commit links.
The board-export-zip and OIDC-redirect-loop entries still linked their
pre-history-move hashes (9c04e5314, d3a217186); 0c77553b8 repointed the
rest of the file but missed these two, so
tests/changelogEntriesBelongToTheirRelease.test.cjs correctly flagged
v11.67 as linking commits it does not contain. Repointed to the current
hashes (f383fe9b3, f3c39f3b2).
2026-09-10 23:15:13 +03:00
Lauri Ojansivu 93814d5c31 Document the People / Notifications admin panel pane.
models/lib/adminUrls.js's people.panes gained a notifications entry
(Admin Panel -> People -> Notifications, the site-wide default for the
3-tier notification-settings popup) that was never added to
docs/Features/Admin-Panel/People/README.md's pane index, so the pane
existed in the product and nowhere in the docs.
2026-09-10 23:14:30 +03:00
Lauri Ojansivu 4e9c378429 CHANGELOG: add entry for the Azerbaijani/Sinhala/Uzbek/Cantonese/Punjabi/Wu/Moroccan Arabic/Burmese/Pashto/Corsican/Hausa translation fill. 2026-09-10 23:12:28 +03:00
Lauri Ojansivu 0aa5c67952 Update the npm/Meteor lockfiles for the SAML accounts package.
wekan-accounts-saml and its @node-saml/node-saml dependency are already
declared in .meteor/packages and package.json; .meteor/versions and
package-lock.json had not been regenerated to match since #708 landed.
2026-09-10 23:11:27 +03:00
Lauri Ojansivu 7b7ad30fef Fix two Jade syntax errors that broke the development build.
listBody.jade's more-options assignee checkbox called a helper directly
inside checked=(...), a call-expression attribute the Jade-to-Blaze
compiler does not support; rewritten as the mustache-attribute pattern
checked="{{#if helper arg}}...{{/if}}" used elsewhere in the codebase.

settingBody.jade's email-template textareas passed a bare numeric Jade
attribute rows=4, which the compiler also rejects; quoted as rows="4".

Both surfaced as compile failures in ./build.sh's development build.
2026-09-10 23:11:19 +03:00
Lauri Ojansivu 48a2a58b5b Translate remaining strings for Azerbaijani, Sinhala, Uzbek, Cantonese, Punjabi, Wu Chinese, Moroccan Arabic, Burmese, Pashto, Corsican and Hausa.
Fills the Roadmap board-view, popup-title, notification-settings and
chart-forecast strings added since these locale files were last completed.
2026-09-10 23:10:59 +03:00
Lauri Ojansivu d3b433d637 Translate remaining strings for Dutch (Netherlands), Polish (Poland), Russian (Ukraine/Russia), Ukrainian (Ukraine), Vietnamese (Vietnam), Chinese (Simplified/UK/Traditional).
Fills the Roadmap board-view, popup-title, notification-settings and
chart-forecast strings added since these locale files were last completed.
ru_RU also fixes the ru-RU.i18n.json symlink target.
2026-09-10 23:10:53 +03:00
Lauri Ojansivu 1ceb3767a7 Translate remaining strings for Czech, Lithuanian, Slovak, Romanian, Chinese, Welsh, Arabic (Algeria/Egypt), Greek (Greece), Hindi (India), Chinese (Hong Kong), Welsh (UK) and German (Austria).
Fills the Roadmap board-view, popup-title, notification-settings, 2FA and
chart-forecast strings added since these locale files were last completed.
2026-09-10 23:10:47 +03:00
Lauri Ojansivu 9bec6100b1 CHANGELOG: note the zh_SG/cs-CZ/gl-ES/gl/sq/ca/ca_ES/ro-RO/bs/cmn/uz/af/af_ZA/az-AZ translation fill. 2026-09-10 23:09:26 +03:00
Lauri Ojansivu b7f78f0b8c CHANGELOG: note the German/Estonian/Basque/French/Bengali/Icelandic/Hebrew/Japanese/Korean translation fill. 2026-09-10 23:08:54 +03:00
Lauri Ojansivu 3b70eabd06 CHANGELOG: note translation batch b40b35422. 2026-09-10 23:08:37 +03:00
Lauri Ojansivu 6d38cd9c25 Translate remaining strings for zh_SG, cs-CZ, gl-ES, gl, sq, ca, ca_ES, ro-RO, bs, cmn, uz, af, af_ZA, az-AZ.
Fills popup titles, Roadmap board view, Two-Factor Auth, notification
settings, and forecast chart strings that were left as English placeholders.
2026-09-10 23:08:29 +03:00
Lauri Ojansivu 5fc7d2b20d Translate remaining strings for German (de-CH, de_DE), Estonian, Basque, French (fr-BE, fr-CA, fr-CH, fr-FR), Bengali, Icelandic, Hebrew, Japanese and Korean.
Fills the placeholder keys added for the Roadmap board view, popup titles
(subtask, card restore, create-board-from-card, archive-all, clone-board,
list-sync), Two-Factor Auth strings, notification-settings and forecast
chart keys that were still sitting at the English source value.
2026-09-10 23:08:13 +03:00
Lauri Ojansivu b40b354225 Translate remaining strings for Acehnese, Arabic, Greek, Finnish, Hindi, French, Croatian, German, Danish, Hebrew, Japanese, Korean, Dutch, Polish, Russian, Ukrainian, Vietnamese, Chinese (Simplified/Traditional).
Fills the newer popup titles, Roadmap board view, Two-Factor Auth and
forecast-chart keys that were still at the English placeholder value.
2026-09-10 23:08:07 +03:00
Lauri Ojansivu 117edc33b2 Fix tests still referencing renamed mirror scripts.
git-mirror-update.sh/.bat were renamed to mirror.sh/mirror.bat, but
buildScriptParity's SKIP list and gitMirrorUpdateScripts's reads still
used the old names, so the parity check flagged mirror.sh/mirror.bat
as unreachable-from-menu and the mirror script test failed to find its
files at all.
2026-09-10 23:04:06 +03:00
Lauri Ojansivu a114b38613 Update changelog. 2026-09-10 22:56:12 +03:00
Lauri Ojansivu dff307b00b Fill in the missing Acehnese, Asturian, Breton, Gujarati, Japanese
(Hiragana), Odia, Telugu, Klingon, Uyghur and Xhosa translations.

The report-chart forecast strings, Roadmap view, list-sync popup and
two-factor-authentication popups were missing their translations entirely
in these locale files (the key was absent, not merely left as English),
which made several upcomingXPlaceholderRepair node test suites fail: they
compare every locale value's __placeholder__/%s inventory against the
English source, and a missing key reads as an empty inventory instead of
matching English's.

Translated directly from each language's vocabulary/grammar, preserving
every __placeholder__ and %-token exactly. Lower confidence on Klingon
(tlh), which has no canonical vocabulary for modern software concepts;
still better than the untranslated key it replaces.

Thanks to xet7 !
2026-09-10 22:55:57 +03:00
Lauri Ojansivu 4338aef014 Fill in the missing Northern Ndebele translations.
Thanks to xet7 !
2026-09-10 22:53:13 +03:00
Lauri Ojansivu 85c7474ca4 CHANGELOG: add the translation-progress fill entries for Nahuatl,
Neapolitan, Nepali, Northern Ndebele, Northern Sotho, Norwegian Bokmål,
Papiamento, Quechua, Romansh, Sardinian, Scottish Gaelic and Shona.

Thanks to xet7 !
2026-09-10 22:52:54 +03:00
Lauri Ojansivu 4c2a6b60cf Fill in the remaining missing Romansh translations.
Thanks to xet7 !
2026-09-10 22:51:46 +03:00
Lauri Ojansivu 0216542827 Fill in the remaining missing Quechua translations.
Thanks to xet7 !
2026-09-10 22:51:30 +03:00
Lauri Ojansivu dcd00c77fc Fill in the remaining missing Papiamento translations.
Thanks to xet7 !
2026-09-10 22:51:14 +03:00
Lauri Ojansivu 5f5d45b61b Update changelog.
Thanks to xet7 !
2026-09-10 22:51:06 +03:00
Lauri Ojansivu 9cbdbb5d4e Fill in the missing Neapolitan translations.
Thanks to xet7 !
2026-09-10 22:50:59 +03:00
Lauri Ojansivu 2df919006c Fill in the missing Tok Pisin, Tongan, Tsonga, Tswana, Upper Sorbian, Urdu,
Valencian, Walloon, Yoruba, West Frisian, Wolaytta, Wolof, Esperanto,
Bulgarian, Persian, Macedonian, Hungarian, Khmer, Latvian, Portuguese,
Belarusian, Armenian, Georgian, Mongolian, Serbian, Tamil, Spanish, Thai,
Turkish, Venda and Zulu translations

Thanks to xet7 !
2026-09-10 22:50:46 +03:00
Lauri Ojansivu 97479a4daf Fill in the missing Sardinian translations.
Thanks to xet7 !
2026-09-10 22:50:29 +03:00
Lauri Ojansivu a5543b77f4 CHANGELOG: add the Admin Panel People / reveal / Frappe Gantt / Docker Compose entry.
Thanks to xet7 !
2026-09-10 22:50:00 +03:00
Lauri Ojansivu 57b5f3ce85 Fill in the missing Northern Sotho translations.
Thanks to xet7 !
2026-09-10 22:49:57 +03:00
Lauri Ojansivu 404dad2396 Update seven node test-suite guards for legitimately-changed behavior.
Each of these pinned a shape that changed on purpose earlier today, not a
regression - updated the assertion and said why in the test:

- adminPageRows: peopleListChanged() now also runs from the #2731 GDPR
  anonymizeUser handler, so the client-count guard expects 3 call sites,
  not 2.
- boardItemLinks: the reveal-clearing loop only applies to route-param
  reveals (swimlane/list), not the hash-driven comment/activity ones; and
  the "same block" extraction for the SILENT comment-delete canary test
  needs to anchor on the DELETE route specifically now that the edit route
  has an identically-shaped guard right above it.
- boardsVisibilitySettings: wekan/wekan#3069's new "external link pattern"
  admin-pane group sits between the URL group and the product-name group.
- canaryCoverage: same anchor fix as boardItemLinks, for the SILENT
  REST-comment-delete canary test.
- cardDetailsAddIcons: the block-boundary heuristic stopped at the first
  "else" it found, which is now the inner "unless currentUser.isWorker"
  branch added for the Worker role - it has to stop at the outer
  "if canModifyCard" else instead.
- cardsCountSwimlaneScope: the naive substring search for the cardsCount()
  helper now matches an unrelated comment mentioning "cardsCount()" earlier
  in the file (on listCardsForSummary); anchored on the actual definition
  line instead.
- crossBoardParentCardLeak: an eleventh visibleLinkedCardIds() cursor
  (CardTextNotes) was added alongside the other linked-card content
  cursors.

Thanks to xet7 !
2026-09-10 22:49:37 +03:00
Lauri Ojansivu 7cc570854f Document SAML the same way in every FerretDB v1 Docker Compose backend.
docker-compose.yml's WeKan service is supposed to be identical, comment for
comment, across the four docker-compose-ferretdb-v1-*.yml backend files -
the whole point of having one per backend is that a user reading any of
them configures the same WeKan. The four backend files still had the bare,
undocumented "#- SAML_ENABLED=true" block from before the SAML 2.0 login
feature's explanatory comments were written; they now carry the same
per-variable comments docker-compose.yml does.

Thanks to xet7 !
2026-09-10 22:49:25 +03:00
Lauri Ojansivu ca9384c4a5 frappeGantt.js imports its own template.
client/components/boards/roadmapView.js imports frappeGantt.js directly for
loadGanttLib/cardsToTasks/popupDetailsHtml, but that module registers
Template.frappeGanttView.* without importing frappeGantt.jade. Whichever
module reaches it first - which can now be roadmapView.js, well before
client/features/gantt.js's own import list gets to the .jade - registers
helpers/events against a template that does not exist yet, which throws and
stops the rest of the module evaluating. Same fix this class of bug already
gets for every other component more than one other module imports.

Thanks to xet7 !
2026-09-10 22:49:20 +03:00
Lauri Ojansivu e4d4b8e052 Fill in the missing Shona translations.
Thanks to xet7 !
2026-09-10 22:49:19 +03:00
Lauri Ojansivu 6e78c0f648 Clear the comment/activity reveal keys on every board/card navigation too.
client/lib/revealBoardItem.js's permalink reveal (#4757) is one-shot:
following a #comment-<id>/#activity-<id> link sets revealCommentId/
revealActivityId in Session, and the board scrolls to and highlights that
element once. The card and board routes already cleared revealSwimlaneId/
revealListId on every navigation so a stale swimlane/list reveal could not
fire on the next board, but never cleared the two comment/activity keys -
so following a comment permalink and then opening a different card could
still scroll to and highlight the old comment once the first card's board
rendered again.

Thanks to xet7 !
2026-09-10 22:49:15 +03:00
Lauri Ojansivu e15f531352 Give Admin Panel / People's Notifications row a URL of its own.
peopleMenu() draws a "Notifications" row (the admin-level default for the
3-tier Notification Settings system) right below Email, but
ADMIN_PAGES.people.panes had no slug for notify-setting, so the row could
not be linked to or deep-linked the way every other row on the page can be.

Thanks to xet7 !
2026-09-10 22:49:11 +03:00
Lauri Ojansivu dd835d5593 CHANGELOG: add the Igbo/Swedish/Indonesian/Occitan/Portuguese/Turkmen/
Tamazight/Inuktitut/Irish/Italian/Javanese/Kannada/Kashmiri/Kashubian/
Kazakh/Konkani/Kurmanji Kurdish/Kyrgyz translation entry.

Thanks to xet7 !
2026-09-10 22:49:05 +03:00
Lauri Ojansivu fd227bf7ca Fill in the missing Scottish Gaelic translations.
Thanks to xet7 !
2026-09-10 22:48:45 +03:00
Lauri Ojansivu 4a2e9650e2 Translate the six new popup titles for Igbo, Swedish, Indonesian, Occitan,
Portuguese (Brazil), Turkmen, Tamazight, Inuktitut, Irish, Italian,
Javanese, Kannada, Kashmiri, Kashubian, Kazakh, Konkani, Kurmanji Kurdish
and Kyrgyz.

Thanks to xet7 !
2026-09-10 22:48:41 +03:00
Lauri Ojansivu aec9d7cd49 Fill in the missing Nepali translations.
Thanks to xet7 !
2026-09-10 22:48:09 +03:00
Lauri Ojansivu e806ad6902 Update changelog. 2026-09-10 22:47:54 +03:00
Lauri Ojansivu f247b04c36 Fill in the remaining missing Norwegian Bokmål translations.
Thanks to xet7 !
2026-09-10 22:47:42 +03:00
Lauri Ojansivu 6358652234 Fill in missing Sicilian, Silesian, Slovenian, Volapük, Southern Sotho,
Swahili, Swati, Tagalog, Tajik, Tatar and Tibetan translations.

Thanks to xet7 !
2026-09-10 22:47:10 +03:00
Lauri Ojansivu 768c0c079a Translate the six popup titles for Ladin, Latin, Luganda, Luxembourgish,
Maithili, Malagasy, Malay, Malayalam, Maltese, Manx, Maori and Marathi.

Thanks to xet7 !
2026-09-10 22:46:49 +03:00
Lauri Ojansivu 0ca5dac441 Add a CHANGELOG entry for the spent-time backfill, Board Settings and
Notification Settings fixes.

Thanks to xet7 !
2026-09-10 22:46:41 +03:00
Lauri Ojansivu 723a2ce471 Update changelog.
Thanks to xet7 !
2026-09-10 22:45:30 +03:00
Lauri Ojansivu 67e4ff69d2 Update changelog. 2026-09-10 22:45:05 +03:00
Lauri Ojansivu d8d3446cc9 Update five node-suite guards for intentional changes made earlier today.
- headerBars.test.cjs: the starred-boards count moved into the user
  model's own starredCount() (now covering swimlanes/lists/cards too,
  #1172), so the test now checks the header delegates to it instead of
  pinning the old inline boards+pages arithmetic.
- notificationEmailHtmlSafety.test.cjs: the notification subject is `let`,
  not `const` - the #2022 admin-template override reassigns it through
  the same safeEmailSubject() guard - so the regex now matches `let`. The
  guard itself was already intact at every call site.
- restCommentDeleteAcl.test.cjs / restSecurityAdvisories.test.cjs: a
  comment-edit PUT route was added (with the correct
  Authentication.checkBoardAccess + assertCanMutateComment(req.userId, ...)
  pair, same as DELETE). restCommentDeleteAcl's negative test previously
  banned any PUT outright; it now asserts the PUT carries the same ACL
  instead. restSecurityAdvisories' commentCreate route slice ended at the
  DELETE handler string, so it now silently swallowed the new PUT's
  checkBoardAccess call and failed a doesNotMatch aimed at POST; the slice
  now stops at the PUT handler, with its own assertions pinning the PUT's
  membership + object-ACL checks.
- rulesDateFieldTrigger.test.cjs: the "text contains" trigger landed
  between r-when-a-card-matches-advanced-filter and the four date
  triggers in every locale file (en.i18n.json included), so the ordered
  key list now expects it there too.

Thanks to xet7 !
2026-09-10 22:44:38 +03:00
Lauri Ojansivu 3f872cccc7 Fix docs/i18n regressions from today's dev session: broken doc links,
duplicate untracked km-KH/ru-RU language files, and six title-less popups.

- docs/Features/Cards/Scrum.md linked ../../DragDrop/Drag-Drop.md and
  ../../Lists/WipLimit/WipLimit.md, one directory level too high from
  docs/Features/Cards/; both 404'd.
- imports/i18n/data/km-KH.i18n.json and ru-RU.i18n.json had drifted into
  independent copies of km_KH.i18n.json/ru_RU.i18n.json instead of being a
  symlink to the file Transifex actually writes, so the registry's
  "km-KH"/"ru-RU" entries loaded a stale duplicate and ru-RU lost two keys
  that only landed in ru_RU.i18n.json. Restored the symlinks.
- Six popups (Add Existing Subtask, Restore Card to Timeline, Clone Board,
  Create Board From Card, Archive All [list] Cards, List Sync) had no
  `<name>Popup-title` key, so they rendered with no header and so no close
  button. Added the title key to en.i18n.json and every locale file (left
  as the English placeholder where no translation exists yet, per the
  untranslated-everywhere rule).
- imports/i18n/data/ace.i18n.json, ba.i18n.json and three other locales
  were missing text-contains-trigger-label/-description entirely, shifting
  every key after them out of position relative to en.i18n.json.

Thanks to xet7 !
2026-09-10 22:44:20 +03:00
Lauri Ojansivu 718d208135 Fill in missing Ladin, Latin, Luganda, Luxembourgish, Maithili, Malagasy,
Malay, Malayalam, Maltese, Manx, Maori and Marathi translations.

Thanks to xet7 !
2026-09-10 22:43:51 +03:00
Lauri Ojansivu 1deae2fcab Fix four regressions from today's heavy dev session: spent-time backfill,
Board Settings description publication, Notification Settings wiring and
two unscaled font sizes.

- allowsSpentTime/allowsSpentTimeOnMinicard have defaultValue: true in
  models/boards.js but were missing from schemaUpgradeSteps.js's
  BOARD_ALLOWS_TRUE_DEFAULTS, so a board created before those flags existed
  would read them as undefined/false and hide its spent-time badge.
- customPrivateBoardDesc/customPublicBoardDesc are read by settingBody.jade
  but were not in server/publications/settings.js's SETTING_FIELDS, so the
  fields always rendered empty and saving them looked like it did nothing.
- notificationSettingsPopup.jade/.js are used by peopleBody.jade but were
  never imported into client/features/settings.js, so the template compiled
  to nothing and the popup did not exist at runtime.
- timelineView.css and two rules in minicard.css still used bare px
  font-size values instead of calc(Npx * var(--wekan-ui-font-scale, 1)),
  so the UI font-size preset did not reach them.

Thanks to xet7 !
2026-09-10 22:42:14 +03:00
Lauri Ojansivu 38739b665b Update changelog. 2026-09-10 22:37:54 +03:00
Lauri Ojansivu 563a0a6edc Guard toLowerCase() call sites reached by non-string values.
Fix TypeError: string.toLowerCase is not a function server unhandledRejections
reported in production. The registration invitation-code check in
Users.after.insert() read doc.authenticationMethod.toLowerCase() unguarded,
but authenticationMethod is only set for oauth2/ldap signups - a normal
password/invitation signup left it undefined and crashed this hook on every
insert whenever disableRegistration was on; doc.emails[0].address was also
read unguarded. The buffered notification-email sender likewise read
user.emails[0].address.toLowerCase() unguarded, crashing when a user (e.g. a
header-auth/LDAP account) has an empty emails array. The CSV/TSV importer's
header-row mapping read headerRow[i].toLowerCase() unguarded, which could
throw on a sparse row cell that isn't a string.

A full audit of every server-reachable .toLowerCase() call site (server/,
models/, packages/) found the rest already guarded (typeof checks, ||
'' fallbacks, or values sourced from validated schema fields).

Thanks to xet7 !
2026-09-10 22:37:03 +03:00
Lauri Ojansivu f6d4fa0dd4 Update changelog.
Thanks to xet7 !
2026-09-10 22:12:57 +03:00
Lauri Ojansivu 8fa2b6d8ec Document card recurrence.
Thanks to xet7 !
2026-09-10 22:11:39 +03:00
Lauri Ojansivu 5e255d174f Translate the card-recurrence-interval strings to every locale.
Reuses each locale's own existing translation of the equivalent
checklist-reset-interval strings (same Off/Daily/Weekly/Monthly concept, and
an "Automatic reset"-style title), so every locale gets a real translation
rather than an English placeholder.

Thanks to xet7 !
2026-09-10 22:11:35 +03:00
Lauri Ojansivu 2e09565376 Add Kanboard-style whole-card recurrence.
A card can now be set to automatically spawn a fresh copy of itself, in the
same list, on a recurring schedule (daily/weekly/monthly) - the same idea
Kanboard has for a recurring task, applied on-premise with no external
dependency. Reuses the exact mechanism already built for a checklist's
automatic reset: a recurrenceInterval field on the card, the same
quave:synced-cron job infrastructure, and the same due-date arithmetic
pattern (models/lib/cardRecurrenceSchedule.js mirrors
models/lib/checklistResetSchedule.js). The card's "..." menu gets a new
"Card recurrence" entry, next to Save card as template, opening a popup
shaped exactly like the checklist's "Automatic reset" popup.

Thanks to xet7 !
2026-09-10 22:11:01 +03:00
Lauri Ojansivu 6a7cc3c575 CHANGELOG: add the Timeline board-view UI and restore-action entry.
Thanks to xet7 !
2026-09-10 22:07:09 +03:00
Lauri Ojansivu 12cd826c37 Add the Timeline board view (read-only history + restore to a past state).
Board View / Timeline (Step 1 of the maintainer's spec): a new menu entry
right after Time, wired end to end like every other view - the
boardChangeViewPopup entry, Utils.setBoardView('board-view-timeline'), an
isViewTimeline() helper and boardBody.jade branch, the two client/lib/utils.js
whitelist arrays, the profile.boardView schema allowedValues, a tooltip-name-
map entry, and template/stylesheet registration in client/features/boards.js.

The view renders a horizontal row of clickable markers built from the
board's distinct activity timestamps (sampled to 50 when there are more),
plus a "Now" marker for the live board. Clicking a marker calls the already-
built, already-tested models/lib/boardTimeline.js's pure
reconstructBoardStateAt(cards, activities, timestamp) - this file does not
reimplement history reconstruction - and renders the result read-only,
grouped by reconstructed list: title, description snippet, labels, members,
due date and an archived badge.

Step 2: each card in a historical view gets a "Restore to this state"
button. It applies the RECONSTRUCTED field values to the card's CURRENT
document by calling only the card's own existing setters one at a time
(setTitle, setDescription, move, addLabel/removeLabel, assignMember/
unassignMember, setDue) - never a bulk update that bypasses them - so each
write is logged as its own Activity by the existing hooks and the restore
itself becomes new, fully visible history. Nothing is deleted. A
confirmation popup (Popup.afterConfirm, the same pattern used elsewhere)
gates the action since it changes the board's current state.

Deliberately deferred, per the task's own scope discipline: "selective
per-member change removal within a time period" is a separate, higher-risk
mutation feature left for a dedicated future pass.

tests/boardViewMenu.test.cjs's VIEWS table gets the new entry (icon
fa-history, template timelineView, helper isViewTimeline) and its HR_AFTER
separator moves from Time to Timeline. tests/boardTimelineRestore.test.cjs
pins that the restore path only calls the card's own setters (with a
negative test scanning for a direct Cards.update/updateAsync bypass), that
the restore button only renders while viewing a historical timestamp, and
that a confirmation step is required before restoring.

Added "Timeline" and its five other UI strings to en.i18n.json and to every
other locale file with real per-language translations (not English
placeholders); verified with fill-translations.mjs --missing.

Thanks to xet7 !
2026-09-10 22:06:38 +03:00
Lauri Ojansivu b382519aae Add a Sync section to the List Settings popup for the list-sync backend.
A board member with write access can now configure list sync from the
List hamburger menu (new "Sync" item, badge shows enabled/paused status)
instead of only through the Meteor console: pick a source type from the
existing SYNC_CAPABLE_SOURCES (Jira/GitHub/GitLab/Gitea/Forgejo), set the
URL/project key, see current status (enabled, last synced, last error)
and run "Sync now" for immediate feedback. This is UI wiring only - it
calls the existing setListSyncSource/hasListSyncCredential/syncListNow
methods (server/methods/listSync.js) exactly as defined; the sync backend
itself is untouched.

The credential field is write-only, the same discipline as the LDAP
Admin Panel override's bind password: it always renders with a hard-coded
empty value, is never pre-filled with the real token even when one is
already stored, and the popup shows only a boolean "a credential is set"
status from the existing hasListSyncCredential method.

Added the new UI strings to en.i18n.json and translated them into all
locale files - real translations for languages this batch covered, and
the English source as a starting value (never a human translation
overwritten) for the remainder pending further translation.

Thanks to xet7 !
2026-09-10 22:05:57 +03:00
Lauri Ojansivu 85f4f5db21 Add a Sync section to the List Settings popup for the list-sync backend.
A board member with write access can now configure list sync from the
List hamburger menu (new "Sync" item, badge shows enabled/paused status)
instead of only through the Meteor console: pick a source type from the
existing SYNC_CAPABLE_SOURCES (Jira/GitHub/GitLab/Gitea/Forgejo), set the
URL/project key, see current status (enabled, last synced, last error)
and run "Sync now" for immediate feedback. This is UI wiring only - it
calls the existing setListSyncSource/hasListSyncCredential/syncListNow
methods (server/methods/listSync.js) exactly as defined; the sync backend
itself is untouched.

The credential field is write-only, the same discipline as the LDAP
Admin Panel override's bind password: it always renders with a hard-coded
empty value, is never pre-filled with the real token even when one is
already stored, and the popup shows only a boolean "a credential is set"
status from the existing hasListSyncCredential method.

Added the new UI strings to en.i18n.json and translated them into all
locale files - real translations for languages this batch covered, and
the English source as a starting value (never a human translation
overwritten) for the remainder pending further translation.

tests/listSyncUiWiring.test.cjs pins: the credential field can never
render or return a real token value (positive + negative source checks),
the status display reads syncSource.lastSyncedAt/lastSyncError/enabled
off the list's own already-published, credential-free fields, the
Meteor.call sites match the existing method names/argument shapes, the
source-type picker only offers SYNC_CAPABLE_SOURCES, and every locale
file has a non-empty value with the %s placeholder intact for every new
key.

Thanks to xet7 !
2026-09-10 22:04:14 +03:00
Lauri Ojansivu a8e1a7fa9d CHANGELOG: add the board-timeline reconstruction entry.
Thanks to xet7 !
2026-09-10 21:42:13 +03:00
Lauri Ojansivu 9811494424 CHANGELOG: add the list-sync entry.
Thanks to xet7 !
2026-09-10 21:41:55 +03:00
Lauri Ojansivu f361668573 Add pure board-timeline reconstruction from the Activities log.
models/lib/boardTimeline.js's reconstructBoardStateAt(currentCards,
activities, asOfTimestamp) computes what each card's title, description,
listId, swimlaneId, labelIds, members, assignees, dueAt and archived flag
would have been at a given moment, by taking the card's CURRENT state and
undoing every activity after that moment in reverse-chronological order.
It reads the board's existing Activities log as the source of truth rather
than storing separate snapshots, and is pure/read-only: no Mongo/Meteor
access, no mutation of its inputs, and no Activity is ever written or
deleted.

Covers createCard, a-changedTitle, a-changedDescription, a-dueAt, moveCard,
archivedCard/restoredCard, joinMember/unjoinMember, joinAssignee/
unjoinAssignee and addedLabel/removedLabel - every activityType that
currently records enough old/new detail to be reversed. moveCardBoard,
setCustomField/unsetCustomField and deleteCard are known but not reversed;
cross-board moves are surfaced via unreversedActivityTypes rather than
silently left unhandled.

This is Step 1 of the "Board View / Timeline" feature only: the read-only
reconstruction function and its tests. The Timeline board-view UI, the
per-card restore action and the selective per-member change removal
described in the same request are not implemented in this commit - see the
CHANGELOG entry for what is and is not delivered.

tests/boardTimeline.test.cjs pins each activityType's undo transform, a
multi-step history reconstructed at several points, that the function
never mutates its inputs, and a negative test scanning the module's source
for any Activities removal call.

Thanks to xet7 !
2026-09-10 21:41:46 +03:00
Lauri Ojansivu a01e8478c3 Add a list-sync job that keeps a list up to date from Jira (and GitHub/GitLab/Gitea).
A WeKan list can be marked with a syncSource (type/url/projectKey) and a
server-only credential (models/listSyncCredentials.js, never published).
server/listSync.js registers a quave:synced-cron job, reusing the SAME
scheduling infrastructure the checklist-auto-reset job uses, that fetches
each synced list's current items and reconciles them against WeKan
(models/lib/listSyncReconcile.js, pure/unit-tested): new items create
cards, changed items update them, and items that disappeared upstream are
ARCHIVED rather than deleted, so old entries stay in the list's history.

Fetching (server/lib/listSyncFetch.js) and parsing reuse the existing
one-time-import parsers in models/lib/externalParsers.js (parseJira is
new there; parseGithub/parseGitlab/parseGitea gained externalId) instead
of a second implementation. Jira works end to end; GitHub/GitLab/Gitea
share the same job and reconcile logic via their existing parsers.

Thanks to xet7 !
2026-09-10 21:41:20 +03:00
Lauri Ojansivu 352d89cb3c CHANGELOG: add the Admin Panel LDAP overrides entry.
Thanks to xet7 !
2026-09-10 21:38:20 +03:00
Lauri Ojansivu ac363f979f Add Admin Panel overrides for LDAP_* environment variables, and a Test
LDAP Connection button.

Every LDAP_* setting server/authentication.js and packages/wekan-ldap read
straight from process.env can now be overridden from Admin Panel / Login,
with an explicit admin value winning over the env var and the env var
winning over nothing (models/lib/configResolver.js's resolveConfigValue(),
pure and unit-tested for the precedence and for its 'admin'/'env'/'default'
source tag). The Admin Panel LDAP section shows, next to every field,
which source is currently in effect - an env var name, "Admin Panel", or
"Unset" - so it is always clear whether a value comes from the environment
or from an admin override.

The bind password never reaches the browser: it is stored in the new
Settings.ldap.bindPassword field, which server/publications/settings.js
deliberately never publishes (only the boolean ldap.bindPasswordSet is).
The password input starts empty and an empty submission leaves the
existing value/source untouched, matching the existing mail-server
password field's pattern. hasConfigValue() is the parallel, secret-safe
resolver: it returns only a boolean and a source, never the value, and a
negative test fuzzes several secret shapes through it to prove that.

Found while wiring this up: packages/wekan-ldap/server/testConnection.js's
existing ldap_test_connection method had its isAdmin check commented out
("TODO: this needs to be fixed - security issue"), so any authenticated
user - not only an admin - could trigger a real LDAP bind attempt against
the configured directory. Fixed to require isAdmin, the same check every
other admin-only Settings method uses, before any connection is attempted.
A new "Test LDAP Connection" button in Admin Panel / Login calls this
method against whichever config (admin override or env var) is currently
resolved and shows the result - success or the directory's own error -
inline, satisfying the "get back error message visible at admin panel"
request without adding a second LDAP client dependency.

Switching between LDAP, OAuth2, SAML and password login already has its
own UI (the Login pane's "Default Authentication Method" selector plus
each method's own enabled flag) and needed no separate switcher; this only
extends "enabled" itself to be admin-overridable, the same as every other
LDAP field.

Scope: LDAP is covered end to end (override + test-connection). OAuth2/
SAML/CAS's env vars are unchanged and stay env-only for now - the resolver
is written to extend to them, but doing so was out of scope for this pass.

Tests: tests/configResolver.test.cjs (precedence, source tagging,
hasConfigValue's secret non-leak, redactCredentialsInUrl for the composite-
connection-string case); tests/ldapAdminOverrideSecurity.test.cjs (the
publication never sends ldap.bindPassword, a whole-tree negative sweep for
any OTHER publication doing the same, the isAdmin gate on
ldap_test_connection runs before any connection attempt, and the method's
response never carries the password); tests/settingPublishedFields.test.cjs
extended to understand dotted/sub-document published fields so it keeps
checking the LDAP section's currentSetting.ldap.* reads against what is
actually published.

Thanks to xet7 !
2026-09-10 21:37:53 +03:00
Lauri Ojansivu 338f991e3d CHANGELOG: add the follow-up documentation entry.
Thanks to xet7 !
2026-09-10 21:35:10 +03:00
Lauri Ojansivu 902f142263 Document Gantt engines, WIP limit groups, custom field admin/order,
label milestones, checklist reset/bulk-edit, card field order and
Flowtime/Pomodoro.

Thanks to xet7 !
2026-09-10 21:34:32 +03:00
Lauri Ojansivu 195fdc4a13 CHANGELOG: add the documentation entry for the new feature guides.
Thanks to xet7 !
2026-09-10 21:30:52 +03:00
Lauri Ojansivu 47fb8f10c5 CHANGELOG: add the text-note entry (#595). 2026-09-10 21:29:59 +03:00
Lauri Ojansivu 1914720360 Document new board-view charts, Bigboard, Roadmap, Group by Assignee,
Multi Board Calendar, Notification Settings, Two-Factor Authentication
and the My Cards/Due Cards/My Attachments member pages.

Thanks to xet7 !
2026-09-10 21:29:43 +03:00
Lauri Ojansivu bc8caeba5d Add a per-card markdown text note, editable in a popup (#595).
A card's own description was the only place to put markdown text, so anything
beyond a single block had to be crammed into it. This adds CardTextNotes: a
small collection of named markdown notes per card, modeled on Checklists (a
denormalized boardId, the same publish/allow/deny shape, the same
GHSA-gv8h-5p3p-6hx7 cross-board-move guard).

Each note renders as a tile with its title and a markdown-rendered preview
(the `viewer` template). "Add text note" and a note's "Edit" open a popup
that reuses the description's own `editor`/`viewer` widgets verbatim - no new
markdown editor was written. "Delete" removes the note, scoped to its own
_id.

Wired into the reactive cache (getCardTextNote/getCardTextNotes, matching the
CardComments pattern), the board/linked-card/lazy-window/single-card
publications, and server/permissions/cardTextNotes.js.

tests/cardTextNotes.test.cjs pins: the model's cardId/boardId scoping, the
allow/deny permission shape, the popup's reuse of `editor`/`viewer` (positive:
+editor is used; negative: exactly one `editor` and one `viewer` template is
declared anywhere under client/components/{cards,main} - the whole tree, not
just the new files, so a competing widget cannot be introduced elsewhere
either), and that add/edit/delete are scoped calls rather than broad
selectors.

Thanks to Lapin0t and xet7 !

Closes #595,
2026-09-10 21:29:22 +03:00
Lauri Ojansivu 67260ed440 CHANGELOG: add the CodeQL code-scanning fixes entry.
Thanks to GitHub CodeQL and xet7 !
2026-09-10 21:22:49 +03:00
Lauri Ojansivu 9cbf67ba7c Fix 8 GitHub CodeQL code-scanning alerts: incomplete escaping, URL
substring check, an overly-permissive regex range and a no-op replace.

- models/lib/cardUrlAutolink.js and packages/markdown/src/
  template-integration.js (kept in sync, per their own comments): the
  card-title markdown-link escape only escaped ']', not the backslash
  that precedes it, so a title ending in a raw backslash escaped the
  ']' this code inserts to close the label instead of the label
  actually closing. Escape '\' before ']'.
- server/lib/documentGif.js: plainSearchText's control-character strip
  used literal raw control bytes inside the regex character class
  instead of \x escapes, so CodeQL flagged the range as unverifiable
  (adjacent control bytes are visually indistinguishable, so a
  boundary could silently shift). Rewritten with explicit \x escapes,
  byte-for-byte equivalent to the original range.
- tests/notificationEmailUrlLink.test.cjs: built a dynamic RegExp by
  hand-escaping only '/', leaving every other meta-character -
  including backslash itself - unescaped. Added the same escapeRegExp
  helper already used elsewhere in the codebase.
- tests/oauthLogoutUrl.test.cjs: asserted a returned URL did not
  contain a hostname via `.includes()`, a substring check a
  confusable/query-embedded hostname can fool either way. Compare the
  parsed `new URL().hostname` instead.
- tests/boardCreationAdminOnly.test.cjs: `.replace(/ /g, ' ')` was a
  no-op (replacing a space with itself); the actual intent was to
  collapse runs of spaces, `.replace(/ +/g, ' ')`.

Every fix has a positive test proving the corrected behaviour and a
negative test reproducing the exact bypass/bug CodeQL flagged. None of
these cross a security boundary on their own (the markdown-link title
escaping is a rendering-correctness fix - DOMPurify still sanitizes
the final HTML regardless, per the existing code comments; the rest
are test-only assertion bugs), so no Admin Panel security-log entry
applies.

Thanks to GitHub CodeQL and xet7 !
2026-09-10 21:20:46 +03:00
Lauri Ojansivu bca5a9320f CHANGELOG: add the import-format audit entry.
Thanks to xet7 !
2026-09-10 21:19:31 +03:00
Lauri Ojansivu baec475feb Add regression tests for CSV, Kanboard and Jira import parsing.
Following the JSON-export truncation report, every IMPORT source was
audited end-to-end the same way the export side already was: WeKan JSON,
WeKan zip, Trello JSON/API/zip, CSV/TSV, Excel, Jira, Kanboard, Markdown,
NextCloud Deck/OpenProject/GitHub/GitLab/Gitea/Forgejo/Asana/Zenkit, and
ICS. Every one of them is genuinely reachable from the UI and produces a
real board - no dead popups, no "Mapper"-only stubs. The WeKan JSON
round-trip (models/wekanCreator.js) restores swimlanes, lists, cards,
checklists, labels and custom fields without dropping any of them, and
attachment import already works both from inline base64 content and from
a bare URL reference (models/wekanCreator.js), so it needs no inline
attachment bytes and is unaffected by the export side now omitting them.
The one real historical bug found in this area, attachments always
empty in JSON export, was already fixed (commit 643e2738b) and is
unrelated to import.

The only genuine gap was test coverage: CSV, Jira and Kanboard import had
real, working parsers but no dedicated tests. This adds
tests/csvCreator.headerMapping.test.cjs, mirroring
CsvCreator#mapHeadertoCardFieldIndex (standard headers, aliases, and the
customfield-<name>-<type>-<extra> dropdown/dropdownMultiSelect/currency/
plain variants), and tests/kanboardJiraCreator.import.test.cjs, mirroring
KanboardCreator's unix-timestamp date parsing and column/swimlane
derivation, plus JiraCreator's issue-link-to-card-dependency mapping
(blocks/is-blocked-by/related-to, unknown targets, self-links and
duplicate links). Both modules import Meteor/model code and can't run
under plain Node, so the tests re-implement the exact production logic
as a faithful copy, following the existing convention in
tests/trelloCreator.import.test.js and the wekanCreator.*.test.js suite.

Thanks to xet7 !
2026-09-10 21:19:12 +03:00
Lauri Ojansivu 19f66f8eb3 CHANGELOG: add the export-format audit entry.
Thanks to xet7 !
2026-09-10 21:14:28 +03:00
Lauri Ojansivu 8955837844 Fix an overly-strict CHART_KEYS regex in the Time export regression test.
Auditing every export format (board JSON/CSV/iCal/HTML/dependency graph/
Kanboard/Trello/Jira/Deck/OpenProject/GitHub/GitLab/Gitea/Forgejo/Asana/
Zenkit/Markdown, and PDF/Excel for all 13 chart/report views) against its
server route, its builder function and the UI entry that offers it found
every one genuinely wired end-to-end - except this test, which asserted
'time' was the LAST entry of models/exportCharts.js's CHART_KEYS Set.
That stopped being true once 'pulse' was appended after it, so the test
failed even though the export itself works correctly. Loosened the regex
to match 'time' anywhere in the Set literal.

Thanks to xet7 !
2026-09-10 21:14:07 +03:00
Lauri Ojansivu cc3c112558 CHANGELOG: add the Roadmap board view entry (#627). 2026-09-10 21:13:42 +03:00
Lauri Ojansivu 84c7140012 CHANGELOG: link the Star Swimlane/List/Card entry to its commit (#1172). 2026-09-10 21:13:00 +03:00
Lauri Ojansivu 784a249331 Add a Roadmap board view grouping cards by a custom field into timeline rows (#627).
A "Roadmap" view for organizing/summarizing cards by version or release
milestone in a timeline layout, similar in spirit to a ProductPlan-style
release roadmap chart. Structurally this is the existing Frappe Gantt view
grouped by the VALUE of a board custom field (a "Version"/"Release"-style
text or dropdown field) instead of one flat list of cards: a dropdown lets
the user pick which custom field to group by (defaulting to the first
text/dropdown field, or a clear empty-state message when the board has
none), each distinct value renders as its own row, and every row is its own
small Frappe Gantt timeline built from the SAME cardsToTasks()/loadGanttLib()
code the plain Gantt views already use, plotted over the same
startAt/dueAt/endAt card dates - no new charting library, no custom-field
creation UI, this view only consumes fields the board already has.

client/components/boards/roadmapView.js reuses
client/components/gantt/frappeGantt.js's loadGanttLib/cardsToTasks/
popupDetailsHtml verbatim, and models/lib/chartCalculations.js's
computeCardsByCustomFieldGroup does the pure "group cards by a custom
field's value" fold (mirroring computeCardsByAssigneeGroup's shape: a card
with no value falls into a "no value" sentinel group, sorted last).
Registered in client/features/boards.js like every other board view.

Extends tests/boardViewMenu.test.cjs's VIEWS array for the end-to-end
menu/helper/template/stylesheet wiring, and adds unit tests (positive,
negative and sort-order) for computeCardsByCustomFieldGroup and its
translateGroupLabel handling in tests/chartCalculations.test.cjs.

Thanks to datenwort and xet7 !

Closes #627,
2026-09-10 21:12:49 +03:00
Lauri Ojansivu c5740e8046 Add Star/Unstar to the Swimlane, List and Card menus, a "Starred" page and a header bookmarks section for them.
Starring a board already existed (profile.starredBoards, toggleBoardStar
in models/users.js / server/models/users.js). This generalizes that same
per-user id-array shape to profile.starredSwimlanes, profile.starredLists
and profile.starredCards, each with its own toggleSwimlaneStar /
toggleListStar / toggleCardStar Meteor method that checks the id and
requires a login the same way toggleBoardStar does.

A Star/Unstar row was added to the Swimlane, List and Card hamburger menus
- a reading action, alongside Copy link and History, above the rows that
change the board. The list's own per-board `starred` field
(client/components/lists/listHeader.js isStarred()/.star(), used for the
sticky/pinned-list highlight) is untouched; the new per-user star uses its
own isListItemStarred helper and js-star-list-item row.

A new "Starred" page (/starred-items) lists everything the current user
has starred, grouped by type, reusing the "open card in place" popup
mechanism myCards/myAttachments already use for the card group. It is
reachable from the "All Pages" member menu next to My Cards / My Due
Cards / My Attachments.

The header bookmarks dropdown (starredBoardsPopup) gained three more
capped sections - Starred Swimlanes/Lists/Cards, five each, most-recently-
starred first - with a "see all" link to the uncapped Starred page. Both
the dropdown and the Starred page read the same starredItemsByType() query
(client/components/main/header.js, imported by starredItems.js), so there
is one definition of "what is starred" rather than two that could drift.

tests/starredItems.test.cjs pins the persistence shape for all three new
types, that starredCount() sums all five starred kinds, that the shared
query has exactly one definition, and that the new i18n keys are used by
all three menus. tests/starredPages.test.cjs's count assertion was updated
to match: the count now goes through the shared starredCount() aggregate
rather than two lengths added inline, still covering every starred kind.

The new labels (Star/Unstar, Starred Swimlanes/Lists/Cards, "See all
starred items", the empty-state message) are added to en.i18n.json and to
every other locale file with real per-language translations.

Thanks to chris-kwng and xet7 !

Closes #1172,
2026-09-10 21:12:34 +03:00
Lauri Ojansivu 5fe87538dd CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-10 21:11:49 +03:00
Lauri Ojansivu 120a1b6651 Show the Time view's client-side summary row and export label for remaining time until due.
The calculation (computeRemainingTimeSum/formatRemainingTime in
models/lib/chartCalculations.js), the server wiring
(server/lib/boardChartData.js's 'time' chartKey branch), the PDF/Excel
export section (models/lib/chartExportRows.js), the new
"board-status-remaining-time-total" i18n key in all locale files, and
the unit tests for #1121 landed already, bundled into concurrent
commits on the same shared files (3480e8a9456e01cabe3ff9997df487bf5cafc83a
and the Pulse board view commit). This commit adds the two pieces that
were still uncommitted: the Time view's own summary row
(client/components/boards/timeView.jade) and its helper
(client/components/boards/timeView.js), which render that total the
same "X days, Y hours" way the export already does.

Thanks to Yachikh and xet7 !

Closes #1121,
2026-09-10 21:11:34 +03:00
Lauri Ojansivu e116c79405 CHANGELOG: add the Pulse board view entry (#1292). 2026-09-10 21:11:34 +03:00
Lauri Ojansivu 7f35409cb8 Add the "Pulse" board view menu label to all locale files.
Fixes #1292,
2026-09-10 21:11:34 +03:00
Lauri Ojansivu 2d8fb6070a Add a "Pulse" board view charting daily board activity, GitHub-Pulse-style.
Fixes #1292,
2026-09-10 21:11:34 +03:00
Lauri Ojansivu 84fdfe6092 CHANGELOG: close the URL filter write-back issue (#319).
Adds the entry for the "Filter sidebar changes now update the URL" commit,
under the existing "Board filters" group next to #4540's read-on-load entry,
and updates that entry's closing note now that the write direction exists.

Thanks to netei and xet7 !

Closes #319,
2026-09-10 21:11:34 +03:00
Lauri Ojansivu 5ffecf7aab Sync the board Filter sidebar's state back into the URL query params.
#4540 (963b01ff5) already lets a board be opened pre-filtered from
`?assignee=johndoe`/`?member=janedoe`/`?label=urgent`, read once on board
load. #319 additionally asked for the other direction: applying a filter
from the sidebar should update the URL too, so a manually filtered view is
itself bookmarkable/shareable without hand-typing the query string.

Adds `client/lib/filterQueryParams.js`'s `resolveIdsToUsernames`,
`resolveIdsToLabelNames` and `buildBoardFilterQueryParams` - the exact
inverse of the existing parser, reusing the same `assignee`/`member`/`label`
token vocabulary - and a reactive `list()` getter on `SetFilter`
(`client/lib/filter.js`) so its current selection can be read outside the
sidebar template. `boardBody.js`'s new `syncFilterQueryParams`, run from a
separate `Tracker.autorun`, resolves `Filter.assignees`/`members`/`labelIds`
back to names and writes them via `FlowRouter.setQueryParams` wrapped in
`FlowRouter.withReplaceState`, so toggling a filter replaces the current
history entry instead of piling up a new one per click.

Covered by tests/filterQueryParams319.test.cjs: the id->name resolvers, the
query-param builder (including empty selections clearing their param and
unknown ids being dropped), a full round trip through #4540's own
`parseBoardFilterQueryParams` proving both directions agree, and source
checks pinning how boardBody.js wires it up.

Thanks to netei and xet7 !

Closes #319,
2026-09-10 21:11:34 +03:00
Lauri Ojansivu 6504c72d55 CHANGELOG: add the checklist/comment PUT endpoints entry (#1037).
Thanks to mayjs and xet7 !

Closes #1037,
2026-09-10 21:11:34 +03:00
Lauri Ojansivu f6e98f1205 Add an Admin Panel "Email Templates" UI for the customizable invite/activity email templates.
The Settings schema fields (inviteEmailSubjectTemplate/BodyTemplate,
activityEmailSubjectTemplate/BodyTemplate), their publication, and the
server-side use in sendInvitationEmail() (server/models/settings.js) and
the buffered activity-notification email (server/notifications/email.js)
already existed, reusing models/lib/ruleVarsSubstitute.js's substituteVars()
- the same {token} substitution the #3304 rule "send email" action uses -
but had no Admin Panel UI to set them, so an admin could not actually reach
the feature. Adds the missing fields (Admin Panel / Email / Email Templates)
with their own Save, right below the SMTP settings.

Left blank (the default on every existing install), WeKan sends its exact
current hardcoded/i18n content for both email types, unchanged. Password-
reset and account-verification emails are deliberately excluded: they stay
hardcoded, since a misconfigured or malicious custom template on a
security-critical email (e.g. one that strips the reset link) would be a
real account-takeover risk.

tests/emailTemplatesCustomization.test.cjs adds regression coverage: an
unset template falls back to exactly the current hardcoded/i18n content,
a set template is substituted through the existing substituteVars() (with
a source-pattern negative test proving there is no second/duplicate
templating implementation), the new Admin Panel labels are translated in
every locale file, and a negative test confirms the password-reset/
verification email code paths (server/lib/resetPasswordEmail.js,
config/accounts.js) never reference any of the four new template fields.

Thanks to saurabharch and xet7 !

Closes #2022,
2026-09-10 21:11:34 +03:00
Lauri Ojansivu 099ab39dd4 Add PUT endpoints for a checklist's title and a comment's text over the REST API.
Auditing the REST API surface against #1037 found two clean CRUD gaps:
every other board sub-resource with GET/POST/DELETE already had a
matching PUT, but a checklist and a comment did not, so editing either
meant deleting and re-creating it.

PUT /api/boards/:boardId/cards/:cardId/checklists/:checklistId renames
a checklist (title only), mirroring the existing DELETE's lookup and
checkBoardWriteAccess check.

PUT /api/boards/:boardId/cards/:cardId/comments/:commentId edits a
comment's text, reusing validateCommentBody and the same
assertCanMutateComment rule (and foreign-edit canary) the DELETE
handler already applies.

tests/restApiEditGaps.test.cjs pins both routes as source-pattern
tests, the same way tests/restApiIdorBatch.test.cjs already does for
this REST surface.

Thanks to mayjs and xet7 !
2026-09-10 21:11:34 +03:00
Lauri Ojansivu 92f188761f CHANGELOG: add TODO Later entry for label-activity notification option (#572). 2026-09-10 21:11:34 +03:00
Lauri Ojansivu eae45d19be Add a regression test confirming label add/remove activity logging (#572).
models/cards.js's cardLabels() hook already inserts Activities documents
with activityType 'addedLabel'/'removedLabel' whenever a card's labelIds
gains or loses a label - wired into a Cards.before.update hook the same way
cardMembers/cardAssignees are, with matching en.i18n.json rendering strings.
Pin that mechanism plus the notification-settings shape it does not yet plug
into, so neither regresses silently.

Thanks to bhagyas and xet7 !

Fixes #572,
2026-09-10 21:11:34 +03:00
Lauri Ojansivu 4c89aa6a78 Make dropping a dragged card on a list's HEADER move it into that list.
The card sortable's connectWith ('.js-minicards:not(.js-list-full)') only
covers each list's card-body area; .js-list-header sits in normal flow
directly above it and does not overlap it, so jQuery UI resolves no
connected container and silently cancels a drop landed precisely on the
header - the card snaps back with nothing happening.

The sortable stop handler now hit-tests the mouseup's own coordinates for a
.js-list-header ancestor and, when found, resolves the same
prevCardDom/nextCardDom/listId/targetContainer a drop at the TOP of that
list's card body would produce, so the existing card.move() mutation and
sort-repair logic are reused unchanged.

Thanks to TylerL-uxai and xet7 !

Fixes #766,
2026-09-10 21:11:34 +03:00
Lauri Ojansivu b467f17008 Add a completion-date projection to the Throughput Histogram (#1476).
#1476 asked for cycle time, lead time, throughput/velocity, bottleneck
analysis, and completion estimates based on velocity. The first four are
already covered by the existing board report charts: the Cycle Time and
Lead Time views (computeLeadCycleTime), the Throughput Histogram
(computeThroughput), and the Control Chart / Cumulative Flow Diagram / WIP
Run views, which are the standard Kanban tools for spotting a bottleneck
even though none of them is literally named "bottleneck".

The one piece that was missing is a forward-looking projection: at the
recent completion rate, when will the cards still open be done. Add
computeCompletionForecast to chartCalculations.js, reusing
computeThroughput's own weekly series rather than recomputing velocity a
second way - it averages the last 4 weeks of completions and divides the
remaining open-card count by that rate to project a date. Wire it into the
Throughput Histogram's server data (server/lib/boardChartData.js) as a
`forecast` field alongside the existing `series`, and show it as a plain-
text note under that chart (client/components/boards/charts/boardCharts.js
and .jade), with three new i18n strings for the none-remaining/no-velocity/
projected cases.
2026-09-10 21:11:34 +03:00
Lauri Ojansivu c2b5fa3aab CHANGELOG: add the creator filter / cross-board filter persistence entries
(#3681, #1751, #567, #2035).
2026-09-10 21:11:33 +03:00
Lauri Ojansivu f7a2da1b1c CHANGELOG: add the disable-a-rule entry (#2322). 2026-09-10 21:11:33 +03:00
Lauri Ojansivu 952679f9c3 CHANGELOG: close the list/swimlane link issue (#1089).
Thanks to xet7 and xet7 !

Fixes #1089,
2026-09-10 21:01:12 +03:00
Lauri Ojansivu 7f7d4e2fb1 Add a regression test confirming two open filter requests were already
implemented.

#567 ("Hide empty lists when filtering items in a board") is
Filter.hideEmpty, wired end to end (sidebarFilters.jade/.js, consumed by
client/components/swimlanes/swimlanes.js). #2035 ("extended Filter feature
that will list up archived cards and cards in archived lists") is
Filter.archive, whose sidebar toggle re-subscribes to the board with the
archived flag set rather than only filtering client-side. Neither had a
regression test pinning that the wiring stays intact; this reads the actual
source for both and fails if either toggle, handler or consumer disappears.

Thanks to Sh0g0-1758 and blaisep and xet7 !

Fixes #567,
Fixes #2035.
2026-09-10 21:00:59 +03:00
Lauri Ojansivu f5829b2ed3 Add a "Filter by creator" filter, and keep member/assignee/creator/date
filters active when switching boards.

Filter.userId (client/lib/filter.js) is a new SetFilter keyed the same way
models/cards.js already names the card-author field, reusing the exact
SetFilter/Filter API the existing member/assignee filters use - no new
filtering engine. A "Filter by creator" sidebar section lists the board's
active members the same way Member/Assignee already do.

config/router.js's board route used to call Filter.reset() (wiping every
filter) whenever the target board differed from the current one. It now
calls the new Filter.resetBoardScoped(), which only clears filters whose
values are scoped to the board being left (labels, custom fields,
dependency types, the advanced/list text filters) and leaves
member/assignee/creator/due-date/title filters in place, since user ids and
dates mean the same thing on every board. Every other Filter.reset() call
site (the sidebar's own Clear button, All Boards, Archive, Public, ...) is
unchanged.

Thanks to lukasz-krawczyk and jarohen-oc and xet7 !

Fixes #3681,
Fixes #1751.
2026-09-10 21:00:54 +03:00
Lauri Ojansivu c8ad1b61d6 Add a regression test pinning the list/swimlane link fix (#1089).
Issue #1089 asked for "Link to this list", and reported the same fault
#6459 later named exactly: the list-more popup's link box read the
nonexistent {{ rootUrl }} template helper, so the box was always empty -
there was no working list link, and no swimlane link at all.

Commit e755b60b3 ("Link to a swimlane or a list, the way you can link to
a card.") already fixed this: models/lib/boardItemUrl.js builds a real
relative path, List#absoluteUrl/Swimlane#absoluteUrl resolve it through
Meteor.absoluteUrl(), and listHeader.js/swimlaneHeader.js's copy-link
handlers call it - confirmed by reading the current code, not just the
commit.

tests/listSwimlaneLinkRootUrlIssue1089.test.cjs pins this: the list and
swimlane copy-link handlers and absoluteUrl() implementations use the
real Meteor.absoluteUrl() API, and (negative) no .jade template or .js
helper anywhere in client/ still references a bare/broken rootUrl -
either the exact string reported in #1089 or a `rootUrl` template
helper, which never existed and was the bug.

Thanks to xet7 !
2026-09-10 21:00:35 +03:00
Lauri Ojansivu b420341719 Add a "card title/description contains {value}" rule trigger.
#2194 asked for a text-search rule condition combinable with other
triggers. WeKan's rules stay single-trigger/single-condition today -
combining several conditions in one rule with AND was already looked
at and explicitly deferred by #4294 (see TODO Later) - so this adds
ONE new standalone trigger type instead: "when a card's title or
description contains {value}", the same scope-down the #3092
advanced-filter trigger used.

A new pure module, models/lib/ruleTextContainsMatch.js, does a
case-insensitive substring test against a card's title/description;
server/rulesHelper.js (already wired to import and call it) evaluates
it the same way it already evaluates the advanced-filter trigger, on
card creation and the a-changedTitle/a-changedDescription activities.
This commit adds the missing pieces to complete that wiring: the pure
module itself, the card-triggers Add Rule UI row (cardTriggers.jade/
.js) with its text input, and tests/rulesTextContainsTrigger.test.cjs
pinning the match function, the trigger registration, the
rulesHelper.js wiring, the UI wiring and the i18n keys.

Thanks to sfahrenholz and xet7 !

Closes #2194,
2026-09-10 21:00:23 +03:00
Lauri Ojansivu bde66a5c7d Add a 3-tier Notification Settings popup (Member/Board/Admin).
Admin Panel / People, Board Settings and Member Settings each gain a
"Notification Settings" menu entry, right below Email in Admin Panel /
People. All three open the same reusable notificationSettingsPopup
template, letting notifications (tray/in-app and email, the two services
Notifications.notify already dispatches to) be turned on or off with the
same precedence the theme override already uses: Admin Panel default,
then Board override, then the member's own override.

models/lib/notificationSettings.js is a small pure module with the
resolution function (resolveNotificationSetting) and the notification-type
catalog; server/notifications/profile.js and server/notifications/email.js
now resolve the decision before adding to the tray or buffering an email,
so a disabled service is genuinely skipped rather than only hidden in the
UI. Settings.notifyDefaultTray/Email hold the admin default,
Board.notifyOverrideTray/Email the board override, and
profile.notifyOverrideTray/Email the member override; each is optional/
nullable so "unset" always falls through to the next level.
2026-09-10 21:00:20 +03:00
Lauri Ojansivu 7ec35b880a CHANGELOG: add the custom-field min/max/date-range summary entry (#2075). 2026-09-10 21:00:13 +03:00
Lauri Ojansivu 453b309c72 Extend the list-header custom-field summary badge with min/max and a
date-field range (#2075).

#3319 already sums a number-type custom field flagged
showSumAtTopOfList=true across a list's (optionally swimlane-scoped)
cards and shows it as a "∑ N" badge. #2075 asked for a broader list-level
summary: min/max for a number field, a range for a date field, and how
many cards have the field set at all. This extends that SAME mechanism -
the same per-field checkbox, the same badge area - rather than adding a
second configuration surface:

- models/lib/customFieldsSum.js gains numberFieldStats() (sum/min/max/
  count-of-total, reusing the exact numeric-parsing rules of the existing
  sumCustomFieldValues()) and dateFieldRange() (earliest/latest among the
  cards, same count/total). Neither touches sumCustomFieldValues() itself.
- client/components/lists/listHeader.js's numberFieldsSum()/
  hasNumberFieldsSum() now share their field/card lookup with the new
  numberFieldsSumTooltip() (adds "(min–max, N/total)" to the sum badge's
  tooltip, wordless so it needs no new i18n key) and the new
  hasDateFieldsRange()/dateFieldsRangeLabel()/dateFieldsRangeTooltip() for
  a date-type field flagged the same way - shown as an earliest–latest
  badge instead of a sum, since summing dates has no meaning.
- listHeader.jade adds the date-range badge next to the existing sum
  badge (both mini-screen and full layouts), and points the sum badge's
  title at the new tooltip helper.
- One new i18n key, "date-range-of-fields", mirroring the existing
  "sum-of-number-fields" tooltip label; min/max/count are numeric-only so
  they need no new translatable words. Added to en.i18n.json and to all
  245 other locale files - a direct translation for the ~65 base
  languages covered by a curated dictionary (reused across their locale
  variants), an English placeholder for the remainder per the
  no-translation-anywhere-yet policy, to be filled the normal way via
  releases/translations/fill-translations.mjs.
- tests/customFieldsSum.test.cjs: a #3319 regression test proving
  sumCustomFieldValues()'s own result is untouched, plus coverage for
  numberFieldStats() (sum/min/max, several flagged fields combined,
  card-count-with-value, non-numeric values ignored, empty input) and
  dateFieldRange() (earliest/latest, Date and ISO-string values, count,
  an unparseable value ignored rather than corrupting the range, empty
  input). node tests/customFieldsSum.test.cjs: 21/21 passed.

Thanks to rlach and xet7 !

Closes #2075,
2026-09-10 20:59:36 +03:00
Lauri Ojansivu da32e7d3ec CHANGELOG: repoint the archive-all-cards entry at its own commit. 2026-09-10 20:56:52 +03:00
Lauri Ojansivu 35ad7bc925 Note the swimlane WIP quick-select test as the #2380 closing reference.
Thanks to bhueck and xet7 !

Fixes #2380,
2026-09-10 20:56:48 +03:00
Lauri Ojansivu 0a9277ce06 CHANGELOG: add the checklist-item-to-linked-subtask entry (#2422). 2026-09-10 20:56:43 +03:00
Lauri Ojansivu 4d54b42bc7 CHANGELOG: fix the swimlane WIP quick-select entry's credit and heading escape (#2380). 2026-09-10 20:56:26 +03:00
Lauri Ojansivu 52891ec016 Add a unit test for the swimlane-scoped WIP limit group arithmetic.
tests/swimlaneWipLimitGroup.test.cjs covers listIdsForSwimlane
(models/lib/wipLimitGroupDecision.js), and the combined-count/over-limit
decision it feeds for #2380 (a WIP limit across a whole swimlane's lists),
proving the combined total is independent of any single member list's own
individual wipLimit, and that a list from a different swimlane is
unaffected.
2026-09-10 20:56:26 +03:00
Lauri Ojansivu c55af0e34a Add regression coverage for the List menu's "Archive all cards in this
list" action.

Thanks to bkiehle and xet7 !

Fixes #3383,
2026-09-10 20:56:22 +03:00
Lauri Ojansivu 33fbf91005 Add "Convert to subtask" / "linked subtask" i18n keys to all locale files.
convertChecklistItemToSubtask-title and checklistItem-linked-subtask
(en.i18n.json's new keys for the "Convert to subtask" checklist-item action,
#2422) translated directly into every other non-English locale file, in
en.i18n.json's key order, right after convertChecklistItemToCardPopup-title.

Thanks to javen9881 and xet7 !
2026-09-10 20:56:08 +03:00
Lauri Ojansivu bf2fa41792 Recompute automatic custom fields on quick-add form reset, not clear them.
A custom field with "Auto create field to all cards" (or "Always on
card") applied to the first card created via a list's quick-add form,
but was silent about it for any card created after: the automatic
fields were computed once, inline in addCardForm's onCreated, and the
form's own reset() unconditionally cleared that list back to [] instead
of recomputing it from the board's current custom-field definitions.
Any reset between two cards in the same session dropped the field
starting with the second card.

Both onCreated and reset() now call a shared
automaticCustomFieldsForCurrentBoard() helper, so the automatic fields
are (re)applied consistently rather than only once per template
lifetime.

Thanks to coleyon and xet7 !

Fixes #2392,
2026-09-10 20:56:05 +03:00
Lauri Ojansivu 5c77c86bb7 Open an archived card in the full card-detail popup, with a Restore action.
The Archive sidebar's card tab only ever showed the narrow shared minicard,
with nothing to click on - there was no `.js-minicard` handler in
sidebarArchives.js at all, so an archived card had no way to be opened beyond
that cramped preview. Clicking one now opens the SAME full card-detail popup
(`cardDetailsPopup` / `Template.cardDetails`) a normal board card already
opens, reusing the exact popupCardId/popupCardBoardId + Popup.open('cardDetails')
mechanism myCards.js and resultCard.js use for their own cross-context
minicards - not a parallel "archived card preview" component.

The normal card-detail action menu had no way to un-archive a card opened
this way: it hid "Archive" while a card was already archived but offered
nothing in its place. Both copies of the action menu (the canModifyCard one
and the read-only one) now show a "Restore" entry exactly where "Archive"
would be, calling the same `card.restore()` mutation the Archive sidebar's
own Restore link already uses, with the same target-list fallback popup for
a card whose list was itself archived or deleted.
2026-09-10 20:56:00 +03:00
Lauri Ojansivu d5d047a635 CHANGELOG: add the notification-email subject entry (#1408).
Thanks to Logicbloke and xet7 !

Closes #1408,
2026-09-10 20:55:35 +03:00
Lauri Ojansivu ad4613099f Add regression coverage confirming notification email subjects include board/card.
Thanks to Logicbloke and xet7 !

Closes #1408,
2026-09-10 20:54:58 +03:00
Lauri Ojansivu 55c3aa8df6 CHANGELOG: add the "Save as Template" card action entry (#2209).
Thanks to andresmanelli and xet7 !

Fixes #2209,
Fixes #1959,
2026-09-10 20:54:44 +03:00
Lauri Ojansivu bc25eee1ba Add "Save as Template" card action, and extract the shared Templates board
creation it reuses.

#2209 (a 2019 follow-up to #2165's template-feature checklist) asked for
"create template from element" - creating a template directly from an
existing board/list/card, rather than only from scratch. WeKan's own
"insert a card FROM a template" flow (searchElementPopup) already existed,
but nothing did the reverse: turning an existing card INTO a template.

The card menu now offers "Save as Template" beside "Copy Card". It posts
to a new saveCardAsTemplate server method that copies the card into the
user's own "Card Templates" swimlane (creating the personal Templates
board on first use, exactly as the existing default-board-template flow
already does), marking the copy type: 'template-card' so it behaves as a
template rather than an ordinary card.

The lazy per-user Templates board creation used to live only inline in
the ensureTemplatesBoard Meteor method; it is now exported as
ensureTemplatesBoardForUserId (server/models/users.js) so this new method
can call it directly server-side instead of duplicating the board/
swimlane setup.

#2209's other two sub-items were checked and are already handled:
"cards don't appear in swimlanes if the general swimlane is deleted"
(#1959) already has thorough startup-rescue coverage in
server/lib/schemaUpgradeSteps.js (the "swimlane-structure" step) plus
regression tests in tests/schemaUpgradeSteps.test.cjs, and "templated
users" was explicitly out of scope per the issue's own text.

Thanks to andresmanelli and xet7 !
2026-09-10 20:54:01 +03:00
Lauri Ojansivu 3b73da9967 CHANGELOG: add the due-date countdown badge entry (#2424). 2026-09-10 20:53:13 +03:00
Lauri Ojansivu 68e6732352 CHANGELOG: repoint the reply-by-email commit link after a shared-checkout reset orphaned the original commit hash. 2026-09-10 20:52:46 +03:00
Lauri Ojansivu 67f1c7c56e Show a countdown ("N days left"/"N days overdue") on the due-date badge.
The due-date badge (card detail and minicard) showed only the formatted
date - no relative countdown, contrary to what the badge's own title
text suggested. dueCountdown() (client/lib/dueDateColor.js) is a pure
day-count helper, sharing its "now" comparison with the existing
dueDateClass() so the countdown and the badge's colour always agree;
cardDate.js's new dueCountdownText() turns it into translated text and
both cardDueDate and minicardDueDate now show it in showDate() (visible
text) and showTitle() (hover), e.g. "Jun 15 (3 days left)" / "Jun 15 (2
days overdue)" / "Jun 15 (Due today)". A completed due date (one with an
end date set) keeps just the plain date - there is nothing left to count
down. Received/start/end date badges are untouched; they use their own
showDate()/showTitle() overrides on the same shared dateBadgeBody markup.

Adds due-today/due-days-left/due-days-overdue to en.i18n.json (right
after card-due-on) and translates them into all 245 other locale files,
keeping the %s day-count placeholder intact everywhere.

Thanks to javen9881 and xet7 !

Closes #2424,
2026-09-10 20:52:39 +03:00
Lauri Ojansivu 0c7524db05 Add reply-by-email: replying to a notification email comments on the card.
WeKan only ever sent email; there was no way to receive it, so replying to a
notification email went nowhere. This adds the webhook-based half of #2414 -
not an IMAP-polling mail client, which would need a running mailbox,
credentials and a polling loop the self-hoster would have to operate. Instead
a self-hoster points a mail provider's inbound-parse webhook (Mailgun Routes,
SendGrid Inbound Parse, Postmark inbound - documented in
docs/Features/Email/Reply-By-Email.md) at a new POST /api/inbound-email.

Every outbound notification email's Reply-To now carries
reply+<cardId>-<hmac>@<domain> (server/lib/inboundEmailReplyToken.js), the
HMAC keyed by INBOUND_EMAIL_HMAC_SECRET so it cannot be forged or guessed.
The webhook verifies that token, resolves the card, strips the reply's quoted
text (server/lib/inboundEmailQuoteStrip.js), matches the sender's address to
an existing WeKan user (server/lib/inboundEmailUserMatch.js - no match is
rejected, never an anonymous comment), and inserts a CardComments document.

Unauthenticated by design, so every rejection (bad/forged token, unmatched
sender) is logged via securityLog under the new authn.inbound-email catalog
key, wrapped so logging can never break the guard.

Both INBOUND_EMAIL_HMAC_SECRET and INBOUND_EMAIL_DOMAIN are opt-in; unset
(the default), no Reply-To is added and existing installs are unchanged.

Thanks to vasyugan and xet7 !

Closes #2414,
2026-09-10 20:51:52 +03:00
Lauri Ojansivu 320c8bbbbb CHANGELOG: add the card-open filter-persistence investigation entry (#2335).
Thanks to PhilSnider and xet7 !

Fixes #2335,
2026-09-10 20:51:37 +03:00
Lauri Ojansivu dfe971d2fe CHANGELOG: add the subtask "inherit parent's labels" entry (#2184).
Thanks to MelBourbon and xet7 !

Closes #2184,
2026-09-10 20:51:22 +03:00
Lauri Ojansivu 02cc799289 Add regression test confirming card open/close never resets board Filter.
#2335 reported that opening a card to edit it resets an active board
filter. Filter (client/lib/filter.js) is a plain module-level singleton,
not keyed by route or Session, and card open/close
(client/components/cards/cardDetails.js) never calls Filter.reset() or
any other filter-clearing method - it only ever calls
Filter.addException() to keep an affected card visible. The only three
Filter.reset() call sites in the client are explicit user actions: the
"clear filter" button, the sidebar "clear all" button, and the `x`
hotkey. So the filter does not reset today; what can look like a reset
is the filtered list reactively dropping a card that no longer matches
the active filter after an edit, which is correct filtering behavior.

tests/filterPersistsOnCardOpen2335.test.cjs pins this: no card-open/close
code path calls Filter.reset()/clear, and every Filter.reset() call site
in client/ and imports/ is one of the three known, explicit actions.
2026-09-10 20:51:13 +03:00
Lauri Ojansivu 4cc7184fe6 CHANGELOG: triage remaining open Rules (IFTTT) issues to TODO Later.
Copy/link rule actions (#4160, #3235), email attachments (#3948),
custom-field rule values (#3195), GitLab sync (#2698), a scheduled
due-date rule action (#4278) and more template variables (#3815) are
each a real feature or need external infrastructure this sandbox
cannot stand up, so they are recorded with their reasons rather than
forced.
2026-09-10 20:50:42 +03:00
Lauri Ojansivu 632a107f33 CHANGELOG: triage remaining open Rules (IFTTT) issues to TODO Later.
Copy/link rule actions (#4160, #3235), email attachments (#3948),
custom-field rule values (#3195), GitLab sync (#2698), a scheduled
due-date rule action (#4278) and more template variables (#3815) are
each a real feature or need external infrastructure this sandbox
cannot stand up, so they are recorded with their reasons rather than
forced.
2026-09-10 20:50:08 +03:00
Lauri Ojansivu 68661eac58 Update changelog. 2026-09-10 20:49:01 +03:00
Lauri Ojansivu 0aa1702c0b Render GFM "- [ ] Task" checklist syntax as a real checkbox.
wekan/wekan#2419: a card description/comment containing task-list syntax
rendered the literal text "<input disable=\"\" type=\"checkbox\"/> Task"
instead of a checkbox, because the markdown-it renderer had no task-list
extension (so it never emitted an <input> at all) and the sanitizer
forbade the input tag outright, so even a typed-in <input> would have
been stripped.

Add a small markdown-it core rule that turns a leading "[ ]"/"[x]"/"[X]"
marker on a list item into a disabled <input type="checkbox">, and allow
that exact shape through secureDOMPurify.js: only type="checkbox", and
never one carrying name/value/form/formaction, so nothing but a plain
checkbox can reach the page. The checkbox is left disabled - click-to-
toggle would mean mapping a rendered click back into the raw markdown
source and saving it, a separate, larger feature from this rendering fix.

Thanks to rodrigocipriani and xet7 !

Fixes #2419,
2026-09-10 20:48:45 +03:00
Lauri Ojansivu de4a95474e Show the current swimlane's name at the bottom of a minicard in List view.
Adds a board-wide Boards.allowsSwimlaneNameOnMinicard toggle (default
false), a Card Settings row for it (already landed in
client/components/sidebar/sidebar.jade/.js and models/boards.js via a
concurrent commit), and the minicard label itself: gated on the board
flag, resolving the swimlane reactively via
ReactiveCache.getSwimlane(card.swimlaneId), styled like the existing
list-name label. tests/minicardSwimlaneNameOnMinicard.test.cjs pins the
default, the Card Settings row, and that the minicard only renders the
label when enabled.

Thanks to JB_Pollard and xet7 !

Closes #2426,
2026-09-10 20:48:30 +03:00
Lauri Ojansivu 205ef76362 Update changelog. 2026-09-10 20:47:29 +03:00
Lauri Ojansivu c79be16d29 CHANGELOG: add the acting-user "add member" rule action entry (#2522). 2026-09-10 20:47:03 +03:00
Lauri Ojansivu ca357ac6bd CHANGELOG: add the WIP limit groups entry (#2489). 2026-09-10 20:46:12 +03:00
Lauri Ojansivu 6f79e87914 Add the missing acting-user module and UI button for rule "add member" (#2522).
The "add member" rule action's acting-user option (issue #2522 - "add
whoever just moved the card as a member") landed on main missing its
shared module: server/rulesHelper.js and cardActions.js already import
RULE_ACTING_USER_SENTINEL/resolveActingUserId from
/models/lib/ruleActingUser, but that file was never committed, breaking
the import on main. It also landed without the actual UI button that
saves the sentinel action.

models/lib/ruleActingUser.js resolves "who triggered this rule" from
activity.userId - the exact same source buildRuleVars() already uses for
the {username} template variable (#3304/#3301) - so both call one shared
function instead of two implementations of the same concept.
cardActions.jade gets the missing trigger button, wired to the existing
js-add-actinguser-member-action handler in cardActions.js.

tests/ruleAddMemberActingUser.test.cjs pins the sentinel resolution, that
rulesHelper.js and buildRuleVars() both call the one shared resolver (with
a negative, whole-tree source-pattern check that no other file
re-implements the same activity.userId shape), that the ordinary
fixed-member path is unaffected, the client/jade wiring, and that every
locale file has a real (non-English-placeholder) translation of the new
label. tests/ruleRemoveMemberAction.test.cjs and
tests/rulesApiTriggerNormalize.test.cjs are updated for the addMember
block's new if/else shape around the sentinel check.

Thanks to arisjr and xet7 !

Closes #2522,
2026-09-10 20:46:04 +03:00
Lauri Ojansivu 8c62894b9c CHANGELOG: add the external issue-tracker autolink entry.
Thanks to grandinj and xet7 !

Closes #3069,
2026-09-10 20:45:57 +03:00
Lauri Ojansivu 187a3df1ce Add a WIP limit shared across several lists together (WIP limit groups).
WeKan already limits work-in-progress per list (models/lists.js wipLimit),
but a workflow that splits "in progress" into several columns (e.g. three
middle columns together) had no way to cap the total across them - only
each column on its own. Boards.wipLimitGroups adds a small array of
{_id, name, listIds, limit, enabled} groups, settable from a new "WIP
Limit Groups" panel in Board Settings (reusing the existing Swimlane/
List/Card settings popup pattern), where 2+ of the board's lists are
picked to share one combined numeric limit.

models/lib/wipLimitGroupDecision.js is the pure arithmetic behind it -
combinedWipLimitGroupCount sums the current card count across a group's
member lists, isWipLimitGroupExceeded mirrors the per-list "exceeded"
threshold (value < count), and isListInExceededWipLimitGroup answers
whether a given list belongs to any group that is currently over its
own shared limit, independent of that list's own individual wipLimit.

The list header reuses the exact same `.highlight` over-limit styling
the per-list WIP counter already uses (client/components/lists/list.css)
rather than a second visual language: every list that is a member of an
exceeded group gets its title highlighted, not only the list that
happens to be over on its own.
2026-09-10 20:45:03 +03:00
Lauri Ojansivu 5a48220687 CHANGELOG: note that #2155 (move/copy multi-selection to another board) is already handled by the existing Move/Copy selection action.
Thanks to gerroon and xet7 !

Fixes #2155,
2026-09-10 20:45:00 +03:00
Lauri Ojansivu 521cb4e332 Add an admin-configurable external issue-tracker autolink for card text.
Admin Panel -> Settings -> Visibility gets a new "External Issue Tracker
Autolink" group: a token prefix (e.g. "#") and a URL template containing
"{number}" (e.g. https://issues.example.com/browse/PROJ-{number}). When both
are set, a bare "<prefix><digits>" token found in card descriptions/comments
is rendered as a link to that external tracker, the same idea as the
Mattermost autolink plugin. Either field left empty keeps the feature off.

WeKan does not autolink bare "#NNNN" to its own cards anywhere - confirmed by
reading the whole markdown pipeline (packages/markdown) and every client
template before adding this, per models/lib/externalLinkAutolink.js's own
comment - so there is nothing internal for this to collide with. It stays
safe regardless: off by default, and it never rewrites a token that already
sits inside an existing markdown link target or an href="..." attribute.

models/lib/externalLinkAutolink.js is the pure, unit-tested matching/URL-
building function; packages/markdown/src/template-integration.js cannot
import app code, so it carries its own small mirror of the same algorithm,
bridged from the setting via a ReactiveVar the same way alwaysShowCodeAsText
already is, kept in sync by client/components/main/editor.js.

server/publications/settings.js publishes the two new fields - a setting a
template reads that the publication does not send always renders empty and
makes "Save" look like it did nothing.

Adds the "external-link-pattern"/-description/-prefix/-url keys to
en.i18n.json and all 245 other locale files, translated directly (no
placeholder service), preserving the "{number}" placeholder untouched in
every language. tests/externalLinkAutolink.test.cjs covers the pure function
(matching, URL building, no-op when unconfigured, the existing-link
collision guard), the settings/publication/bridge wiring, i18n key placement
and placeholder preservation across every locale file, and confirms by
source inspection that no internal #NNNN-to-card autolinker exists anywhere
in the tree.
2026-09-10 20:44:45 +03:00
Lauri Ojansivu 02e028276e Add regression coverage confirming multi-select already offers Move/Copy selection to a different board.
Thanks to gerroon and xet7 !

Fixes #2155,
2026-09-10 20:44:31 +03:00
Lauri Ojansivu 0ac3d0ccc8 CHANGELOG: add Sign in with Apple entry (#2458). 2026-09-10 20:43:47 +03:00
Lauri Ojansivu b925b21708 Restore the "send email" rule action's automatic description line (#2713).
Concurrent edits to server/rulesHelper.js's sendEmail block in this shared
checkout dropped the "Description: ..." footer line added earlier for
#2713 (the description sits right next to the pre-existing "Card:"/"Link:"
lines from #3301, so it merged awkwardly). Restoring it: the sendEmail
action now appends the card's description automatically again, same as its
title and link, guarded the same way (only when non-empty).

Thanks to kabi178 and xet7 !
2026-09-10 20:43:34 +03:00
Lauri Ojansivu ddcf810750 CHANGELOG: add the due/start/end/received date-changed rule trigger entry (#2474). 2026-09-10 20:43:04 +03:00
Lauri Ojansivu 517bee3f0b Add Sign in with Apple support: server-signed JWT client secret for OAuth2.
Apple's Sign in with Apple is OIDC-compatible, so it works through Wekan's
existing generic OAuth2/OIDC client - except its "client secret" is not a
static string: it must be a short-lived JWT the server signs itself (ES256),
using a private key downloaded from Apple's developer portal. Every other
generic OAuth2 provider Wekan supports (Keycloak, Authelia, Nextcloud, ...)
keeps sending its static OAUTH2_SECRET unchanged.

models/lib/oauth2ClientSecretJwt.js mints that JWT using only Node's built-in
crypto module (no new dependency: ES256 signing with IEEE-P1363 signature
encoding has been supported since Node 12). It is opt-in: when
OAUTH2_SECRET_JWT_KEY_PATH is unset (the default, and every existing
provider's configuration), maybeGenerateOauth2ClientSecretJwt() returns null
and packages/wekan-oidc/oidc_server.js falls back to the static OAUTH2_SECRET
exactly as before.

Apple's other quirk - it returns the user's name only on the very first
authorization - needs no special-casing: Accounts.onCreateUser
(server/models/users.js) already copies the OIDC fullname/email claims into
the user's profile only once, at account creation, and never overwrites them
on later logins (Meteor's updateOrCreateUserFromExternalService only touches
services.oidc.* for a returning user, not profile.*).

docs/Features/Login/Apple.md documents Apple's endpoints and the new env
vars, mirroring the Keycloak/Authelia docs pattern.

Thanks to xet7 !

Closes #2458,
2026-09-10 20:42:42 +03:00
Lauri Ojansivu 46a7390c95 CHANGELOG: add the rule-editing/email-description entry, defer attachment forwarding (#2713).
Thanks to kabi178 and xet7 !
2026-09-10 20:42:31 +03:00
Lauri Ojansivu 340ee1c7aa Add regression tests for the due/start/end/received date-change triggers.
Mirrors tests/rulesAssigneeTrigger.test.cjs's pattern: proves the 4
activityTypes are registered with the right matchingFields, that the
existing Cards.before.update timing-field hook is what feeds them (SET
only, never an $unset clear), that the matcher fires/doesn't fire on the
right board and doesn't cross-fire between the 4 date fields or on an
unrelated activity, that the Rules UI wires up all 4, and that every
locale file got a real (non-English) translation for the 4 new keys in
the right position.

Thanks to justinr1234 and xet7 !

Closes #2474,
2026-09-10 20:42:21 +03:00
Lauri Ojansivu 7b91c41bbf CHANGELOG: add the card-URL-to-title rendering entry (#2453). 2026-09-10 20:42:04 +03:00
Lauri Ojansivu 1d4a47db25 Render a pasted link to another WeKan card with that card's title.
A card description or comment containing a plain, pasted URL to another
WeKan card ("/b/<boardId>/<slug>/<cardId>", optionally with the
#comment-/#activity- fragment from #4757) rendered as a raw, unlabeled
link. models/lib/cardUrlAutolink.js is a pure parser/rewriter that finds
such URLs in text and replaces one not already inside a markdown/HTML
link with "[title](url)", given a title resolver - mirrored inline in
packages/markdown/src/template-integration.js (that package cannot
import app code, the same reason externalLinkAutolink.js is mirrored
there for #3069) and run in the 'markdown' Blaze helper just before
markdown-it's own render.

The resolver is wired in client/components/main/editor.js's existing
Meteor.startup as Markdown.resolveCardTitle, a plain function calling
ReactiveCache.getCard(cardId). Because that lookup is itself a reactive
Tracker dependency read inside the markdown helper's own reactive
computation, the rendered title updates automatically if the target
card is later renamed, and resolves to nothing - leaving the bare URL
untouched - for a card this client's Minimongo has not received: a
deleted card, or one on a board the current viewer cannot see. That
fallback is exercised directly with a mocked resolver in
tests/cardUrlAutolink.test.cjs, alongside URL parsing (boardId/slug/
cardId, fragments, rejecting unrelated links) and the "already inside a
link" no-double-linking guard.

Thanks to justinr1234 and xet7 !

Closes #2453,
2026-09-10 20:41:41 +03:00
Lauri Ojansivu bbc0d3f0b8 CHANGELOG: add the checklist check-all/uncheck-all entry (#2473). 2026-09-10 20:41:40 +03:00
Lauri Ojansivu 29488f8d52 Add rule triggers for due/start/end/received date changes.
server/triggersDef.js now registers the 'a-dueAt'/'a-startAt'/'a-endAt'/
'a-receivedAt' activityTypes that models/cards.js's setDue/setStart/
setEnd/setReceived already log via server/models/cards.js's timing-field
hook (the same activity the due-date-change-count feature, #6081, already
reads). This wires those existing activities into the Rules matcher so a
rule can trigger "when the due/start/end/received date is set or changed",
reusing the TriggersDef-driven matching machinery every other trigger
already uses.

Thanks to justinr1234 and xet7 !

Closes #2474,
2026-09-10 20:41:40 +03:00
Lauri Ojansivu 3926e558d8 CHANGELOG: add the "Multi Board Calendar" board view (#2469).
Thanks to justinr1234 and xet7 !
2026-09-10 20:41:04 +03:00
Lauri Ojansivu 3158b87c57 Let a board admin choose whether "Time spent" shows on the card/minicard.
The card detail view and minicard already rendered a card's accumulated
spent-time badge (and its overtime indicator) unconditionally once time was
logged, but there was no way to turn it off, and reaching it in the first
place meant the card's hamburger/context menu. Add allowsSpentTime /
allowsSpentTimeOnMinicard board fields (both default true, so no existing
board's display changes) and a matching Card Settings row - the same
"Show on card"/"Show on minicard" pattern already used by
allowsReceivedDate/allowsReceivedDateOnMinicard - so an admin can hide it
per board.

Thanks to matrixes and xet7 !

Closes #2530,
2026-09-10 20:41:04 +03:00
Lauri Ojansivu 0c15b56f6e Add a "Multi Board Calendar" board view (#2469).
Planyway-style: shows due/start/end/received dates for cards across
every board the current user belongs to, not just the currently open
board, right below Calendar in the Board View menu.

Reuses the single-board Calendar view's FullCalendar rendering as-is
and #4223 Bigboard's all-boards membership query/subscription pattern,
prefixing each event with its board's title so entries stay
distinguishable. Cross-board drag-to-reschedule is out of scope here;
the view is read-only and the single-board Calendar's own drag
handling is unaffected.

Thanks to justinr1234 and xet7 !

Closes #2469,
2026-09-10 20:40:27 +03:00
Lauri Ojansivu 6d43020212 Add "Check all items" / "Uncheck all items" to the checklist action menu.
The checklist's own action popup (checklistActionsPopup) had reset,
hide-checked, hide-all and export/edit-as-text actions but no way to bulk
check or uncheck every item at once - #4218's "Edit as text" only offers an
indirect workaround (replace every "[ ]"/"[x]" by hand). Checklists.
checkAllItems()/uncheckAllItems() already existed as model helpers used by
the Rules automation (server/rulesHelper.js), so this wires the same two
methods to new menu entries, and extracts the item-selection logic they
share into a pure, unit-testable helper (models/lib/checklistBulkCheck.js).

Thanks to justinr1234 and xet7 !

Closes #2473,
2026-09-10 20:40:17 +03:00
Lauri Ojansivu 5286fd7c18 CHANGELOG: add the "card matches advanced filter" rule trigger (#3092).
Thanks to signalcodec and xet7 !

Closes #3092,
2026-09-10 20:39:57 +03:00
Lauri Ojansivu bf32494bce CHANGELOG: note that #2413 is resolved by the #3249 board-admin fix.
Thanks to JackNWeems and xet7 !

Fixes #2413,
2026-09-10 20:39:03 +03:00
Lauri Ojansivu 677c60fb2a Document that the #3249 board-admin/site-admin fix also covers #2413.
Both issues describe the same gap from opposite directions: #3249 is the
board whose creator left leaving nobody able to manage it, and #2413 asks
for site admins to be able to view/change permissions on any board. The
isBoardAdminOrSiteAdmin/allowIsBoardAdminOrSiteAdmin helpers and the
Boards.allow update/remove wiring landed for #3249 already grant exactly
what #2413 asked for, so tests/boardAdminOrSiteAdmin.test.cjs is annotated
to say so explicitly.

Thanks to JackNWeems and xet7 !

Fixes #2413,
2026-09-10 20:38:46 +03:00
Lauri Ojansivu ac4b7e75fe Add the anonymizeUser server method and its unit tests (#2731).
server/models/users.js's new anonymizeUser Meteor method (already committed)
requires models/lib/userAnonymization.js for its pure decision/update-shape
logic, matching models/lib/userDeletionCleanup.js's split for removeUser -
that module and its test were still untracked, so the require was pointing
at nothing. Add both now.

Thanks to Akuket and xet7 !

Closes #2731,
2026-09-10 20:38:44 +03:00
Lauri Ojansivu b8a6de1c89 Let a rule's trigger/action be edited in place, and email the card's description too.
#2713 asked for two things.

Editing a rule used to mean delete it and rebuild it from scratch, losing
its position and its identity. rulesList's rule row gets a second "Edit
trigger/action" button next to the existing title-rename pencil, opening
the same trigger/action wizard used to create a rule (rulesMain.js /
rulesTriggers / rulesActions and the board/card/checklist/mail action
templates), pre-filled with the rule's current title. A new server method,
rules.updateRule (server/rulesButton.js), mirrors rules.createRule's
authorization and cross-board destination checks but REPLACES the existing
trigger/action documents in place (full-document update by their existing
_id, not remove+insert), so the rule keeps its own _id, and its trigger/
action keep theirs, across an edit. Every action-template click handler
that used to call rules.createRule or insert Triggers/Actions/Rules
directly now goes through one shared helper,
client/components/rules/rulesSaveHelper.js, which picks create vs. update
based on whether the wizard was opened to edit an existing rule.

The "send an email" rule action already appended the card's title and a
link to it automatically (#3301), even when the user's own template used
none of the {card}/{cardLink} tokens; it did not do the same for the card's
description. server/rulesHelper.js now appends "Description: ..." to the
footer alongside the existing title/link lines, using the vars.description
value buildRuleVars already computed.

Actually attaching the card's FILE ATTACHMENTS to the outgoing email is
deferred - see CHANGELOG TODO Later. Every WeKan email today goes through
either Meteor's `Email.sendAsync`/`EmailLocalization.sendEmail`, which take
{ to, from, subject, text }, with no `attachments` parameter anywhere in
this codebase's call sites; wiring a real file through would need the
mailer wrapper itself to grow attachment support and code to read the file
back out of whichever storage backend (local disk / GridFS / S3) holds it,
which is mailer-level scope well past this rule action.

tests/ruleUpdateInPlace.test.cjs pins rules.updateRule's authorization,
its RuleBleed cross-board guard, and - the part that actually makes it an
edit rather than a second create - that it keeps the rule/trigger/action
_ids stable, including a logic-level round trip against a small in-memory
mock proving a changed actionType does not leave the old type's fields
behind. tests/ruleEmailIncludesDescription.test.cjs pins the new
description line, guarded the same way the existing title/link lines are
(only appended when non-empty).
tests/ruleCardActionSchema.test.cjs (#6630's guard, that desc lives on the
Action document and never leaks onto the Rule document) is updated for the
new saveRuleTriggerAction call shape.

Thanks to kabi178 and xet7 !
2026-09-10 20:38:21 +03:00
Lauri Ojansivu 16c8f425d0 Let a rule's trigger/action be edited in place, and email the card's description too.
#2713 asked for two things.

Editing a rule used to mean delete it and rebuild it from scratch, losing
its position and its identity. rulesList's rule row gets a second "Edit
trigger/action" button next to the existing title-rename pencil, opening
the same trigger/action wizard used to create a rule (rulesMain.js /
rulesTriggers / rulesActions and the board/card/checklist/mail action
templates), pre-filled with the rule's current title. A new server method,
rules.updateRule (server/rulesButton.js), mirrors rules.createRule's
authorization and cross-board destination checks but REPLACES the existing
trigger/action documents in place (full-document update by their existing
_id, not remove+insert), so the rule keeps its own _id, and its trigger/
action keep theirs, across an edit. Every action-template click handler
that used to call rules.createRule or insert Triggers/Actions/Rules
directly now goes through one shared helper,
client/components/rules/rulesSaveHelper.js, which picks create vs. update
based on whether the wizard was opened to edit an existing rule.

The "send an email" rule action already appended the card's title and a
link to it automatically (#3301), even when the user's own template used
none of the {card}/{cardLink} tokens; it did not do the same for the card's
description. server/rulesHelper.js now appends "Description: ..." to the
footer alongside the existing title/link lines, using the vars.description
value buildRuleVars already computed.

Actually attaching the card's FILE ATTACHMENTS to the outgoing email is
deferred - see CHANGELOG TODO Later. Every WeKan email today goes through
either Meteor's `Email.sendAsync`/`EmailLocalization.sendEmail`, which take
{ to, from, subject, text }, with no `attachments` parameter anywhere in
this codebase's call sites; wiring a real file through would need the
mailer wrapper itself to grow attachment support and code to read the file
back out of whichever storage backend (local disk / GridFS / S3) holds it,
which is mailer-level scope well past this rule action.

tests/ruleUpdateInPlace.test.cjs pins rules.updateRule's authorization,
its RuleBleed cross-board guard, and - the part that actually makes it an
edit rather than a second create - that it keeps the rule/trigger/action
_ids stable, including a logic-level round trip against a small in-memory
mock proving a changed actionType does not leave the old type's fields
behind. tests/ruleEmailIncludesDescription.test.cjs pins the new
description line, guarded the same way the existing title/line lines are
(only appended when non-empty).
tests/ruleCardActionSchema.test.cjs (#6630's guard, that desc lives on the
Action document and never leaks onto the Rule document) is updated for the
new saveRuleTriggerAction call shape.

Thanks to jvavassori and xet7 !
2026-09-10 20:37:56 +03:00
Lauri Ojansivu 32c0b07758 CHANGELOG: add the minicard unread-comments entry (#3078). 2026-09-10 20:37:26 +03:00
Lauri Ojansivu fd935f7242 Add an optional "Sort by votes" mode that floats highly-voted cards up.
#3050: cards within a list are always rendered in the manual drag `sort`
order, with no way to bring the highest-voted cards to the top without
reordering them by hand.

The existing board-wide "Sort" popup (`cardsSortPopup`, already offering
due date / title / created date) gets a new "Sort by votes" entry -
extending it is the natural, minimal fit since it is already the one
alternate-sort mechanism WeKan has for cards, rather than building a
separate per-list toggle or a new multi-criteria picker.

Vote score (positive votes minus negative votes) is not a real Mongo
field, so it cannot be expressed as a Mongo sort spec the way due date/
title/created date are. `{ votes: -1 }` is used as a marker only:
`cardsWithLimit()` (client/components/lists/listBody.js) recognizes it,
fetches the window in the underlying manual `sort` order, and re-sorts
the resulting array in JS by vote score - a pure DISPLAY-order change.
The manual `sort` field on each card is never touched, so switching the
mode back off (or the plain "Sort" reset) restores the exact manual
drag order.

models/lib/voteSortCards.js extracts the comparator as a plain,
Meteor-free module (mirrors models/lib/boardSortReorder.js and
models/lib/sortCardsByTitle.js) so the scoring and ordering rules are
unit-testable: highest vote score first, a card with no votes scores 0
and sorts last, and ties (including two zero-vote cards) keep their
relative manual-sort order via a stable sort - proven in
tests/voteSortCards.test.cjs.

Thanks to xet7 !

Closes #3050,
2026-09-10 20:37:09 +03:00
Lauri Ojansivu f63460be7c Update changelog. 2026-09-10 20:36:57 +03:00
Lauri Ojansivu 5567537890 Add regression coverage for the minicard unread-comments highlight.
Pins the pure hasUnreadComments() decision (comment-after-last-view,
never-viewed-with-a-comment, zero comments, malformed timestamps), that
profile.cardLastViews reuses the existing collapsedCardSections shape rather
than a new tracking mechanism, that opening a card is what clears it, and
that the minicard highlight is a class (not a background fill that would
hide a label swatch).

Thanks to H4usi and xet7 !

Closes #3078,
2026-09-10 20:36:51 +03:00
Lauri Ojansivu 3d7c4fbb0f CHANGELOG: add the two-factor authentication entry (#3058). 2026-09-10 20:36:45 +03:00
Lauri Ojansivu 92bb200b49 CHANGELOG: drop an unrelated hunk pulled in by the #2719 move-card commit.
The previous commit's pathspec commit picked up an unrelated in-progress
edit to the spent-time section (gating it on currentBoard.allowsSpentTime)
that happened to be sitting in the same file in the shared working tree.
That edit belongs to different, unfinished work and had no test or
CHANGELOG entry of its own; restore the card-details-item-spent block this
commit's Move-card checkbox change should not have touched.
2026-09-10 20:36:07 +03:00
Lauri Ojansivu b13a5af330 Add a three-state label filter: unfiltered -> include -> exclude -> clear.
#2886: clicking a label filter chip only ever toggled between unfiltered
and filtering FOR that label. Filter.labelIds now has a companion
Filter.excludedLabelIds SetFilter (same API/shape), and a new
Filter.toggleLabelFilter(labelId) cycles a label through three states:
not in either set -> added to labelIds (include) -> moved to
excludedLabelIds (exclude) -> removed (back to unfiltered).
Filter._getMongoSelector() merges the exclusion into the existing
labelIds selector ({$in, $nin}) rather than a separate ignored key, so a
card carrying an excluded label is filtered out even when it also
matches an included label - exclusion wins over inclusion. An
exclude-only filter (no included label) is also handled: isActive() and
the filterSelector-push condition both check excludedLabelIds, and
reset() clears it too.

sidebarFilters.js's 'click .js-toggle-label-filter' handler now calls
Filter.toggleLabelFilter() for a real label chip, keeping the existing
plain two-state Filter.labelIds.toggle() only for the special "no label"
pseudo-entry (data-filter-id="__none__"), which is out of scope for this
three-state cycle. sidebarFilters.jade gives an excluded chip a distinct
"excluded" class (struck-through text via sidebar.css) plus a fa-ban icon
tooltipped with the new filter-label-excluded i18n key, alongside the
existing fa-check used for an included chip.

Scoped to labels only, matching the issue's exact wording - members, due
dates and the other filter types keep their existing two-state toggle in
this pass; the same three-state treatment could be added to them later if
wanted.

tests/labelFilterThreeState.test.cjs drives the real client/lib/filter.js
under plain `node` (via tests/helpers/meteorStubLoader.mjs, an ESM loader
hook stubbing only the Meteor packages/modules filter.js imports) rather
than reimplementing the logic, and pins: the exact three-click cycle in
order (unfiltered -> included -> excluded -> unfiltered), that the cycle
repeats and that two labels cycle independently, and the card-matching
predicate - an excluded-only card is filtered out, an excluded label
wins over an included one on the same card, and an exclude-only filter
(nothing included) still filters correctly.

Thanks to bennyandresen and xet7 !

Closes #2886,
2026-09-10 20:35:40 +03:00
Lauri Ojansivu 98836c7973 CHANGELOG: add SQRL login (#2460) to TODO Later.
Thanks to xet7 !
2026-09-10 20:35:37 +03:00
Lauri Ojansivu a49e9d70aa Add a per-board iCal (.ics) export feed, answering #2836.
#808 added the in-app Calendar view; #2836 ("CalDAV or iCal Support") asked
specifically for calendar EXPORT/SYNC via iCal or CalDAV, which did not exist
- only a one-way .ics IMPORT (icsImport.js, #6323) was in the codebase, with
a comment pointing to a separate external project for export.

Adds a new GET /api/boards/:boardId/calendar.ics route (models/export.js)
that streams a subscribable, read-only iCalendar feed of a board's cards:
one VEVENT per Received / Start-End span / Due date, the same four dates the
Calendar view already draws. Public boards need no token; private boards
authenticate the same way every other export route does (?authToken=, or a
logged-in session), and reuse Exporter.canExport()/_scopedCardSelector() so
the feed honours the same board-visibility and swimlane/list scoping as the
JSON/CSV/PDF exports. The ICS text itself is built by a new pure, dependency-
free module, models/lib/icalExport.js (mirrors icsImport.js's style), so it
is unit-testable without Meteor and reusable elsewhere.

The board Export popup gets a new "iCal" group with one link, built through
the existing exportUrl()/EXPORT_FORMAT_GROUPS table so it carries the same
authToken/scope handling as every other export format.

Deliberately EXPORT only, one-way, read-only: full CalDAV is a stateful,
two-way sync PROTOCOL with its own server (PROPFIND/REPORT, ETags,
collections), which is a much larger feature than a dates feed. Every
calendar client that can "subscribe to a URL" - Google Calendar, Apple
Calendar, Thunderbird, Outlook - reads a plain .ics feed like this one
directly; CalDAV is not needed for that.

Thanks to xet7 !

Closes #2836,
2026-09-10 20:35:37 +03:00
Lauri Ojansivu 0eaa97230b Add native TOTP two-factor authentication via Meteor's accounts-2fa.
Issue #3058 asked for two-factor authentication on WeKan's own
username/password login, not through a third-party OAuth provider. Added
Meteor's official accounts-2fa package (MIT, part of the meteor/meteor
monorepo, same publisher as accounts-password already in use) instead of
hand-rolling TOTP.

A new "Two-Factor Authentication" section in the member menu
(client/components/users/userHeader.jade/.js) calls
Accounts.generate2faActivationQrCode to show a QR code plus a manual-entry
secret, and Accounts.enableUser2fa/disableUser2fa to finish enabling or to
turn it off; Accounts.has2faEnabled drives which of those is shown. All
TOTP secret generation and code verification is done by accounts-2fa
itself - WeKan only renders what it returns and calls its documented
functions.

On the sign-in form (config/accounts.js, client/components/main/layouts.jade),
a normal Meteor.loginWithPassword failure with error.error ===
'no-2fa-code' now shows a second "enter your 6-digit code" step instead of
a generic error, and resubmits via Meteor.loginWithPasswordAnd2faCode -
accounts-2fa's own login method for this case. The decision of which step
to show is a pure function (imports/lib/twoFactorAuthLoginDecision.js),
unit-tested in tests/twoFactorLoginState.test.cjs without a running Meteor
server. wekan-accounts-lockout already anticipated this: its
loginFailureDecision.js already treated 'no-2fa-code' as a non-countable
step so 2FA logins are never mistaken for brute-force attempts.

Scope: opt-in, per-user TOTP only, as the issue asked - no backup codes, no
SMS, no admin-enforced 2FA in this pass; accounts-2fa does not offer any of
those out of the box either.

This environment has no Meteor CLI, so `meteor add accounts-2fa` and the
login UI could not be exercised end-to-end here; the package was verified
against its published source (packages/accounts-2fa/package.js, version
3.1.0) and docs.meteor.com instead, and added to .meteor/packages/versions
by hand.

New UI strings (twoFactorAuth-*/twoFactorCode-*) were added to
en.i18n.json and translated into the ~100 locales WeKan already had
existing coverage for to translate from; the remaining locale files keep
the English source as a placeholder pending translation, reported by
node releases/translations/fill-translations.mjs --missing.

Thanks to r0bbie and xet7 !

Closes #3058,
2026-09-10 20:35:33 +03:00
Lauri Ojansivu 79dfd596f1 Add a checkbox to Move card to leave a linked card at the original spot.
#2719: moving a card to a different board/list now offers "Leave a link at
the original location" in the Move card popup. Checked, the move still
happens as normal and a linked-card mirror (the existing
Cards.helpers().link() mechanism from #4281's "Link to board" action) is
created at the card's original board/swimlane/list, pointing at the (now
moved) card. Unchecked - the default - nothing changes from a plain move.

The original board/swimlane/list are captured from the card before
card.move() runs, and card.link() is called with them afterwards, so the
mirror is created after the destination update, using the same picker
(cardDestinationPicker) Move/Copy/Link already share.

Thanks to superlou and xet7 !

Closes #2719,
2026-09-10 20:35:09 +03:00
Lauri Ojansivu 76dcb6575a Add an "Admin only" flag on custom field definitions (#3141).
A custom field marked Admin only has its value hidden from - and cannot be
set by - a non board-admin board member: not on the card detail view, not on
the minicard, not in the card's "assign a custom field" popup list, and not
through the setCardCustomFieldCheckbox/setCardCustomFieldCurrency Meteor
methods or a direct client write of customFields.<index>.value. The toggle
itself, in the custom-field definition editor, is only rendered for and only
writable by a board admin (CustomFields.allow's update/insert rules now check
board.hasAdmin() specifically for the adminOnly field, on top of the existing
write-access check every other field edit already requires).

models/lib/customFieldsWD.js gets a small pure filterAdminOnlyDefinitions()
helper so the gate has one tested choke point: models/cards.js's
customFieldsWD() - shared by both the card-detail and minicard templates -
filters admin-only definitions out before matching them to a value, and
client/components/cards/cardCustomFields.js reuses the same helper for the
popup's field list.

Thanks to CarloRampini and xet7 !

Closes #3141,
2026-09-10 20:34:30 +03:00
Lauri Ojansivu 5f261bc223 CHANGELOG: add the shared template board picker entry (#2684). 2026-09-10 20:34:23 +03:00
Lauri Ojansivu 07f6cda95e Let the template picker search a template board shared by another member.
A template-container board is a regular board with a special type, so it
already gets normal board membership - adding another user as a board
member of it is the existing, generic sharing mechanism, exactly like
sharing any other board, and server/publications/boards.js's
boardTemplates publication already lists any template-container board a
user is a member of, not only ones they personally created.

The gap was the "apply a template" picker (Template.searchElementPopup,
opened by the card/list/swimlane/board "from template" buttons in
client/components/lists/listBody.js): it was hard-wired to only the
current user's own profile.templatesBoardId, so a template board shared
by another member never appeared there even though it already showed up
in the All Boards "Templates" view. The picker now also subscribes to
boardTemplates and offers any OTHER template-container board the user is
a member of in a dropdown, defaulting to the user's own board as before.

Thanks to ADDAH-temp and xet7 !

Closes #2684,
2026-09-10 20:33:57 +03:00
Lauri Ojansivu 9d1b2915ef Send a push notification (not just email) when a user is invited to a board.
#3136: Users.inviteUserToBoard (server/models/users.js) only ever sent an
invitation email. Board membership/watcher changes already fan out through
Notifications.notify(user, title, description, params) - the same helper
server/models/activities.js calls for card assignment, due dates, mentions
and every other activity-driven notification, reaching both the email
service and the in-app notification bell - but an invite itself never went
through it.

inviteUserToBoard now also calls Notifications.notify(user, 'push-invite-title',
'push-invite-text', params) with the same params object built for the
invitation email, right after the email is sent. It is guarded by
`!isNewUser`: a brand-new invitee created from an email address with no
matching WeKan account has no established notification target yet, so they
stay email-only, exactly as before, with no error. The push call has its own
try/catch so a failing notification service can never break the invite.

Added push-invite-title/push-invite-text to en.i18n.json and every other
locale file, reusing each locale's own already-translated
email-invite-subject/email-invite-text wording (the only existing invite
wording to draw a style from), so every locale ships a real translation
immediately - no English placeholders except the en-* regional variants,
which are English by design.

Added tests/boardInvitePushNotification.test.cjs: a source-inspection
regression test (inviteUserToBoard is a full Meteor method and cannot run
outside a Meteor server) pinning that the fix reuses the exact
Notifications.notify(user, title, description, params) helper/signature
already used elsewhere - exactly one call site, not a second
implementation - guarded by `if (!isNewUser)`, wrapped in its own try/catch,
with the email send left unconditional, and that every locale file carries
the two new keys with the same placeholder tokens as their email
counterparts.

Thanks to CondensedTea and xet7 !

Closes #3136,
2026-09-10 20:32:27 +03:00
Lauri Ojansivu 694f26bf75 Highlight a minicard when it has comments the user has not seen yet.
There was no way to tell at a glance which cards had new comments since the
user last looked (#3078). Add a per-user, per-card last-viewed timestamp
(Users profile.cardLastViews, same shape as the existing
profile.collapsedCardSections) set whenever the user opens a card's detail
view, and a pure, tested decision (models/lib/unreadComments.js) that flags
a card as unread when it has a comment created after that timestamp, or any
comment at all when the card was never opened. The minicard shows a subtle
inset highlight (minicard-unread-comments) and a tooltip when flagged, and
opening the card clears it.

Thanks to H4usi and xet7 !

Closes #3078,
2026-09-10 20:32:13 +03:00
Lauri Ojansivu eb7a9d8493 CHANGELOG: add issue #2509 to TODO Later.
Thanks to javen9881 and xet7 !
2026-09-10 20:31:41 +03:00
Lauri Ojansivu 3428793b2a Update changelog. 2026-09-10 20:30:19 +03:00
Lauri Ojansivu fdc84e2e68 Accept an hour-only or empty time in the card date popup's time field.
Thanks to fakaki and xet7 !

Fixes #2903,
2026-09-10 20:29:42 +03:00
Lauri Ojansivu bd7a8b4208 CHANGELOG: add the label due-date / milestone entry (#2802). 2026-09-10 20:29:13 +03:00
Lauri Ojansivu 1c772ade9f CHANGELOG: note the subtask-swimlane-inheritance entry (#2732).
Thanks to savin-msk and xet7 !

Fixes #2732,
2026-09-10 20:28:49 +03:00
Lauri Ojansivu ab1f60d806 Cap comment replies at one level of threading, grouped under their parent.
A comment's Reply link (added earlier for #5907) let a reply be posted
against ANY comment, including another reply, so clicking Reply enough
times nested comments arbitrarily deep. For #3011, a reply now attaches
to a reply's own parent instead of the reply itself - resolveParentId()
(models/cardComments.js) makes that decision once, is unit tested, and
is applied both when the client opens the composer (so the "In reply
to ..." banner already names the right comment) and again in a
CardComments.before.insert hook server-side, so the cap holds no
matter how a comment is inserted.

Replies also now render directly under their top-level parent instead
of interleaved by date with unrelated comments: groupCommentsByThread()
(imports/lib/commentThreading.js) reorders the already-sorted flat list
the comments template already used, with no schema or query change.

The "Replying to <author>" indicator on the composer reuses the
existing, already fully translated comment-in-reply-to string plus the
parent comment's author name, rather than adding a new i18n key that
would need translating across every locale file for a small wording
difference.

Added tests/commentReplyFlattening.test.cjs (the one-level cap, both
the client and server wiring) and tests/commentThreadGrouping.test.cjs
(grouping, including the regression cases: a flat list of only
top-level comments is unchanged, and a comment whose parent was
deleted still renders as top-level rather than being dropped).

Thanks to FuXXz and xet7 !

Closes #3011,
2026-09-10 20:28:46 +03:00
Lauri Ojansivu 520b9f56fc Keep #3847's sticky list headers pinned to the page while scrolling in the Swimlanes view.
.swimlane's unconditional `overflow: auto` made every swimlane row its own
CSS scroll container on both axes, so `.list.list-sticky-header
.list-header`'s `position: sticky` (from #3847) stuck within that row's own
box instead of the real, page-level vertical scroll on `.board-canvas` -
list titles still scrolled away when scrolling down through swimlane rows.
`.swimlane` keeps `overflow-x: auto` for its row of lists but no longer
captures the vertical axis (`overflow-y: visible`), so the same toggle now
also pins headers correctly in the Swimlanes view. No second mechanism was
added; #3847's single `stickyListHeaders` toggle and CSS rule are reused.

Thanks to mikesutton and xet7 !
2026-09-10 20:28:39 +03:00
Lauri Ojansivu 2b7d899784 Note that #2561 is the same request as #4256 and is already fixed.
tests/labelTextVisibility.test.cjs pins the board-level
Boards.showLabelText setting (with its per-user override) that already
resolves #2561: a board-level toggle to hide label text on minicards,
leaving only the colour bars, the same request #4256 made and this suite
already covers.

Thanks to javen9881 and xet7 !

Fixes #2561,
2026-09-10 20:28:35 +03:00
Lauri Ojansivu 1af1d7ad3f Let a label carry its own optional due date, so it can serve as a milestone.
Add a nullable labels.$.dueAt field to the board schema (models/boards.js),
unset by default so every existing label and board is unaffected. The
existing label create/edit popup gets a "Due Date" input wired through
Boards.addLabel/editLabel's new trailing dueAt argument; editLabel unsets it
explicitly when cleared. The labels list shows the date next to a label when
set. A "milestone" is then a label with a due date, and filtering cards by
that label is the existing label filter - no new Milestone object or filter
UI needed.

Thanks to locnide and xet7 !

Closes #2802,
2026-09-10 20:28:31 +03:00
Lauri Ojansivu 9aaecba8b1 Add a regression test proving subtasks inherit the parent's swimlane.
tests/subtaskSwimlaneInheritance2732.test.cjs pins the existing behaviour
in server/models/cards.js's addSubtaskCard: it looks up the parent card's
own swimlane, reuses the destination subtasks board's swimlane whose
title matches it, and only falls back to that board's default swimlane
when no matching swimlane exists there yet.

Thanks to savin-msk and xet7 !

Fixes #2732,
2026-09-10 20:28:12 +03:00
Lauri Ojansivu 34d6f7d678 Update changelog. 2026-09-10 20:27:56 +03:00
Lauri Ojansivu 2e752c1e96 Extract the OIDC RP-Initiated Logout URL builder into a pure, tested helper.
#2905 asked for Single Logout (SLO): logging out of Wekan should also end the
identity provider's own SSO session for OIDC/OAuth2 providers that support
RP-Initiated Logout (e.g. Keycloak's
/realms/<realm>/protocol/openid-connect/logout), via the optional
OAUTH2_LOGOUT_ENDPOINT env var. This was already implemented for #6158
(getOauthLogoutUrl() in server/models/settings.js, wired into
config/accounts.js's onLogoutHook(), documented in
docs/Features/Login/Keycloak/Keycloak.md and the docker-compose.yml OAuth2
example blocks) - when unset (the default), logout is unchanged.

The URL-building logic lived inline in the Meteor method, so it had no direct
test coverage. Extracted it to server/lib/oauthLogoutUrl.js's
buildOauthLogoutUrl(), a plain-Node pure function (endpoint/serverUrl/
clientId/redirectUri in, the end_session URL out - or '' when endpoint is
unset), following the same pattern as server/lib/ldapPasswordLoginGuard.js.
getOauthLogoutUrl() now just calls it; behavior is unchanged.

Added tests/oauthLogoutUrl.test.cjs covering: the default no-op when
OAUTH2_LOGOUT_ENDPOINT is unset/empty, a Keycloak-shaped path endpoint
resolved against OAUTH2_SERVER_URL (with and without a trailing slash), an
absolute endpoint that ignores serverUrl, an endpoint that already carries a
query string, optional client_id/post_logout_redirect_uri, and percent-
encoding of the redirect URI.

Thanks to Dzordzu and xet7 !

Closes #2905,
2026-09-10 20:27:34 +03:00
Lauri Ojansivu af934591d8 CHANGELOG: add the HTML notification email URL link entry (#3118). 2026-09-10 20:23:56 +03:00
Lauri Ojansivu b6da4ebe96 Wrap card/board URLs in HTML notification emails in real <a href> links.
The HTML-formatted notification email built its body from the same
plain-text line used for the non-HTML email, so the card/board URL sat as
bare text instead of a clickable link. buildHtmlNotificationLine() now
builds the HTML body directly, escaping the actor name/description exactly
as before and wrapping the URL in an escaped <a href>. The plain-text email
is unchanged.

Thanks to papimla and xet7 !

Closes #3118,
2026-09-10 20:23:43 +03:00
Lauri Ojansivu f1caa6688b CHANGELOG: add the checklist automatic-reset entry (#3818, #4729).
Thanks to travelg and xet7 !

Closes #3818,
Closes #4729.
2026-09-10 20:22:44 +03:00
Lauri Ojansivu ec69a54a5e Translate the checklist automatic-reset labels for Acehnese, Kinyarwanda and Flemish.
The bulk i18n fill for the new checklist-reset-interval* keys (previous
commits) had no base-language match for ace/rw/vl-SS and left them on the
English source as a placeholder; replace those three with real
translations.

Thanks to travelg and xet7 !
2026-09-10 20:21:47 +03:00
Lauri Ojansivu 4990a846cb CHANGELOG: add the checkbox minicard icon entry (#3142). 2026-09-10 20:21:34 +03:00
Lauri Ojansivu 16a919279d Add an "Automatic reset" entry to the checklist actions menu.
Lets a board member pick the new Checklists.resetInterval (none/daily/
weekly/monthly, see the previous commit) from the checklist's own action
popup, next to Move/Copy Checklist.

Thanks to travelg and xet7 !
2026-09-10 20:21:25 +03:00
Lauri Ojansivu 09a785f6a1 Update changelog. 2026-09-10 20:21:04 +03:00
Lauri Ojansivu df96ee03ca Show a checkbox custom field's value as a tick/cross icon on the minicard.
A checkbox-type (boolean) custom field shown on a minicard rendered its
value as a bare .materialCheckBox square (and other types fell through
to plain text), which is hard to read at a glance next to the other
minicard badges. It now renders a Font Awesome fa-check-circle (true) or
fa-times-circle (false) icon instead, colored green/red, with a title
tooltip using the existing "yes"/"no" i18n keys - no new translatable
strings were needed. Every other custom field type (text, number,
currency, date, dropdown, multi-select, stringtemplate) is unchanged,
and the full card-detail checkbox editor still uses its real checkbox
input.

tests/minicardCustomFieldCheckboxIcon.test.cjs pins the icon markup for
both the labelled and full-width minicard branches, that the old
materialCheckBox/plain-text rendering is gone for checkbox specifically,
that other types are unaffected, and that the card-detail editor is
untouched.

Thanks to CarloRampini and xet7 !

Closes #3142,
2026-09-10 20:20:53 +03:00
Lauri Ojansivu 6ba3a3eb9a Wire up the checklist automatic-reset periodic job.
server/checklistResetSchedule.js registered its SyncedCron job at module
load, but nothing loaded the module - import it from server/imports.js,
next to the other scheduled-job registrations.

Thanks to travelg and xet7 !
2026-09-10 20:20:47 +03:00
Lauri Ojansivu f9c046dd2e Add a Using WeKan for Scrum guide and link it from docs/README.md.
Thanks to lonix1 and xet7 !

Closes #3087,
2026-09-10 20:20:40 +03:00
Lauri Ojansivu 73128dd7fc Add a per-checklist automatic-reset schedule (daily/weekly/monthly).
A checklist can now be set to automatically uncheck all of its items on a
recurring schedule via Checklists.resetInterval ('none' by default, or
'daily'/'weekly'/'monthly') and Checklists.lastResetAt. The due-date
arithmetic is a pure, unit-tested module
(models/lib/checklistResetSchedule.js), and the periodic scan
(server/checklistResetSchedule.js) reuses the existing quave:synced-cron
infrastructure server/scheduledRules.js already registers a job on, running
hourly to uncheck items of checklists whose interval has come due.

Thanks to travelg and xet7 !

Closes #3818,
Closes #4729.
2026-09-10 20:20:35 +03:00
Lauri Ojansivu f27a97a94f CHANGELOG: add the sticky list headers entry (#3847). 2026-09-10 20:19:31 +03:00
Lauri Ojansivu d3e0c591ad Add regression coverage for the board-wide "sticky list headers" toggle.
Pins the source-level wiring for #3847: the Boards.stickyListHeaders field
defaults to false, its getter/setter and the member-gated Meteor method,
the listActionPopup hamburger-menu entry and its click handler, the
board-driven list-sticky-header class, and the conditional CSS rule (with a
negative check that the unconditional .list-header rule stays unsticky).
Actual on-screen scroll-pinning cannot be checked without a browser, so this
is source/CSS-level verification only.

Fixes #3847,
2026-09-10 20:18:42 +03:00
Lauri Ojansivu 016293d6d9 Update changelog.
Thanks to ikomhoog and xet7 !

Closes #3626,
2026-09-10 20:17:58 +03:00
Lauri Ojansivu 5d0b08a721 Add "Add existing card as subtask" i18n key to all locale files.
Two new keys for the #3626 "add an existing card as a subtask" feature:
add-existing-card-as-subtask (the action label) and
add-existing-card-as-subtask-empty (the search-popup empty state, which
reuses each locale's own existing no-cards-found translation verbatim).
Both are inserted right after add-subtask, in en.i18n.json's key order,
in all 245 other locale files, translated directly (no external
translation service) using each language's own vocabulary; a number of
low-confidence entries for smaller/under-resourced languages are best
read as an invitation for a native speaker to improve them via
Transifex, per the project's translation policy.

Thanks to ikomhoog and xet7 !
2026-09-10 20:17:01 +03:00
Lauri Ojansivu 27f5051be0 Add an existing card as a subtask directly from the parent card's UI.
Issue #3626 asked for three things. The numeric subtask progress
indicator was already correct (pinned by the earlier #4050 work), and
multiple parents per card is a real data-model change deferred to
CHANGELOG TODO Later. This commit is the third, clearly-scoped part:
a way to pick an EXISTING card as a subtask from the current card's
Subtasks section, instead of only being able to create a brand-new one.

A new "Add existing card as subtask" trigger sits next to "Add a new
subtask" (client/components/cards/subtasks.jade). It opens a search
popup (addExistingSubtaskPopup) scoped to the current card's board,
filtered to exclude the card itself, cards already parented to it, and
anything that is already an ancestor of it (setParentId's #3328 cycle
guard would refuse those anyway, so they are filtered out before the
user can pick them). Selecting a result calls the exact existing
card.setParentId(...) method (models/cards.js) on the picked card --
the same re-parenting method every other caller uses -- so no new card
is created and no other field of the picked card is touched.

Thanks to ikomhoog and xet7 !
2026-09-10 20:16:49 +03:00
Lauri Ojansivu fe7270e696 CHANGELOG: add the quick-add "More options" entry (#3967). 2026-09-10 20:15:22 +03:00
Lauri Ojansivu 7e7aa4e5b1 Add regression coverage for the quick-add "More options" single-insert path (#3967).
Pins two things from source: models/cards.js's cardCreation inserts exactly
one Activities document per Cards.insert regardless of which optional
fields the doc carries (no per-field loop, unlike the customField update
hook), and server/models/cards.js's Cards.after.insert calls only
cardCreation - so a card created with description/dueAt/assignees already
set produces exactly one watcher-notification email, not one per field.
Also pins that client/components/lists/listBody.js's addCard folds those
"More options" fields onto the SAME cardFields object passed to the single
Cards.insert call, never into a follow-up Cards.update.

Thanks to Side2005 and xet7 !

Closes #3967,
2026-09-10 20:15:12 +03:00
Lauri Ojansivu 59878c5904 Add the "more-options" quick-add i18n key for #3967.
The "More options" toggle in the quick-add card composer
(client/components/lists/listBody.js/.jade, already committed) needs a
label. Translated in every locale file, reusing each language's existing
word for "options" where one is already used elsewhere in that file.
2026-09-10 20:15:00 +03:00
Lauri Ojansivu 5605e08dd9 Add a board-wide "sticky list headers" toggle to the List hamburger menu.
A list's cards scroll inside .list-body (overflow-y: scroll), a sibling
AFTER .list-header rather than a child of it, so the header already stays
put in the ordinary bounded-height board layout. Add Boards.stickyListHeaders
(default false) and position: sticky on .list-header when it is on, so the
header also stays pinned in any layout where .list itself turns out to be
the actual scrolling ancestor instead. The toggle is board-wide - freezing
one list's header while its neighbours scrolled normally would look
inconsistent - but it is exposed from each List's own hamburger menu
(listActionPopup) for discoverability, next to Set WIP Limit.

Thanks to JFa-Orkis and xet7 !

Closes #3847,
2026-09-10 20:14:09 +03:00
Lauri Ojansivu 3f03beeb8a CHANGELOG: add the cross-board card drag entry (#3298). 2026-09-10 20:13:18 +03:00
Lauri Ojansivu c81cd18522 CHANGELOG: add the checklist-item-to-card drag entry (#3294). 2026-09-10 20:12:20 +03:00
Lauri Ojansivu ac7822aa26 Allow dragging a card between two boards' lists in the Bigboard view.
#4223's Bigboard view stacks every board a user belongs to on one page.
List-level dragging was deliberately scoped to stay within one board
(connectWithSelector() in swimlanes.js), but card-level dragging between
lists was never scoped that way - the cards sortable's
connectWith: '.js-minicards:not(.js-list-full)' in list.js already
connects across every board shown in Bigboard.

The drop handler still resolved the destination board from
Utils.getCurrentBoard() - the board the page happens to be routed to -
instead of from the list the card was actually dropped into. On a
normal single-board page those are the same board, so it went
unnoticed; in Bigboard, dropping a card into a list belonging to a
different board than the route's currentBoard silently moved the card
onto the wrong board.

Resolve the destination boardId from the dropped-into list's own
boardId (listData.boardId), exactly as the analogous list-to-swimlane
move in swimlanes.js already does with list.boardId, and pass it - not
currentBoard._id - to every card.move() call the stop handler makes.
Card.move() already fully supports a boardId change (label/member/
custom-field remapping, dependency cleanup), and the server-side
denyCrossBoardMove already authorizes only when the caller can write
to the destination board, so no model or permission change was needed.

Add tests/listCardCrossBoardMove.test.cjs, a source-level regression
test that pins the fix (targetBoardId/targetBoard resolution, both
card.move() calls using it) and negatively asserts card.move() is
never called with currentBoard._id directly, plus that list-level drag
scoping (connectWithSelector) stays untouched.

Thanks to lauripiispanen and xet7 !

Closes #3298,
2026-09-10 20:12:10 +03:00
Lauri Ojansivu 338e05b1eb Dragging a checklist item onto a list creates a new card from its text.
#3294 asked for a checklist item to become a card when dragged out onto a
list, and to be marked done when dropped onto a "Done"-style list instead.
A checklist item was already draggable via its own jQuery UI sortable
(scoped to other checklists via connectWith '.js-checklist-items'), so
dropping it anywhere else - a list's own card column - always reverted with
no effect at all.

The sortable's stop handler now checks, via document.elementFromPoint at
the drop coordinates, whether the release landed over a list's
'.js-minicards' card column rather than back inside a checklist. When it
does, a new card is created titled from the item's text, in that list (and
swimlane, resolved the same way list.js's own card-drop handler resolves
it), through a pure buildCardFromChecklistItem() helper
(models/lib/checklistItemToCard.js) so the "what does the new card look
like" logic is pinned by a test without a Meteor database. The original
checklist item is left completely untouched either way - the drag always
reverts visually (sortable('cancel')), since nothing needs to move within
the checklist.

Scope decision: dropping ALWAYS creates a new card. The "mark done when
dropped on a Done-style list" half of the request is intentionally NOT
built - detecting that a list "means" Done would mean guessing from its
name or position, which is unreliable and would surprise users. That
capability is not actually missing: an item can already be marked done
directly via its own checkbox (ChecklistItems' toggleItem()), and WeKan
also already has a manual, explicit "Convert to card" action
(convertChecklistItemToCardPopup) for the same underlying card-creation
case - this drag gesture is a faster path to the same outcome, not a new
concept.

Thanks to BenjamindeJong82 and xet7 !

Closes #3294,
2026-09-10 20:11:47 +03:00
Lauri Ojansivu d0dde87a08 CHANGELOG: add the assignee added/removed rule trigger entry (#3390).
Thanks to HayWo and xet7 !
2026-09-10 20:10:47 +03:00
Lauri Ojansivu 595f0954e4 CHANGELOG: add the default-board-template entry (#4205). 2026-09-10 20:10:05 +03:00
Lauri Ojansivu 5ea1b84ad2 CHANGELOG: add the My Attachments member-menu entry (#3461). 2026-09-10 20:09:28 +03:00
Lauri Ojansivu b9b36629a9 Add regression coverage for the assignee added/removed rule triggers (#3390).
Rules already trigger on a MEMBER being added to or removed from a card
(joinMember/unjoinMember). assignees is a separate card field from members,
and joinAssignee/unjoinAssignee triggers mirroring the member ones (same
matchingFields shape, same Add Rule UI pattern, same workflow-palette entry)
are now wired up in server/triggersDef.js, client/components/rules/triggers/
cardTriggers.jade/.js and rulesWorkflow.js, with the new i18n keys
translated in every locale file.

tests/rulesAssigneeTrigger.test.cjs pins: the trigger registration and its
matching behavior (including that it does NOT fire on the sibling member
activity or vice versa), the Add Rule UI and workflow-palette wiring, and
that every locale file has the 4 new keys translated and in place.

Thanks to HayWo and xet7 !

Closes #3390,
2026-09-10 20:08:17 +03:00
Lauri Ojansivu e6958bf8fe CHANGELOG: add the board-search-matches-comments entry (#3841). 2026-09-10 20:08:03 +03:00
Lauri Ojansivu 5fbbbeca92 Let a user mark a board template as default, applied when creating a board.
#4205: a board template could be applied manually (the "Template" link on
the Create Board form opens a picker of the user's Board Templates and
copies the chosen one), but there was no way to make one the default, so
every new board meant reopening that picker each time.

Add a star toggle to each row of that picker (Template.searchElementPopup,
isBoardTemplateSearch) that marks/unmarks one "Board Templates" card as the
user's default (profile.defaultBoardTemplateId/-BoardId, both optional and
unset by default). Toggling goes through a new toggleDefaultBoardTemplate
method that only accepts a live, unarchived linked-board card from the
caller's own templates board.

The plain "type a name and click Create" board-creation flow now checks for
a default and, when set, applies it by calling the SAME copyBoard method the
manual picker already uses - not a second copy of the board-copying logic -
before falling back to the unchanged blank-board path. A user who never sets
a default sees no change at all. Deleting the underlying template board
clears it as anyone's default so creation cannot fail against a dead id.

Thanks to Jieiku and xet7 !

Closes #4205,
2026-09-10 20:08:01 +03:00
Lauri Ojansivu a9dd6b05b0 Add a My Attachments page to the member menu.
A third sibling of My Cards / My Due Cards: every attachment the current
user has uploaded, across every board they can see (their own boards, and
public ones), in one place. The menu entry sits right after My Due Cards
(client/components/users/userHeader.jade), and its own route (/my-attachments,
config/router.js) renders a dedicated page
(client/components/main/myAttachments.jade/.js) grouped board > swimlane >
list > card, reusing the same "open the card in place" popup mechanism
myCards.js's .js-minicard handler uses (#3640) so a click never navigates
away and loses the reader's place in a list spanning many boards.

The new `myAttachments` publication (server/publications/cards.js) filters
by BOTH the uploader (this user's own attachments only) and board visibility,
using the same boardVisibilitySelectors() the All Boards list and the board
publication already use (GHSA-gwc4-fw7p-gw58) rather than a hand-rolled
duplicate - so an attachment on a board the user cannot see is never
published, even if its userId field somehow matches. The query shape itself
lives in a small pure module, models/lib/myAttachmentsQuery.js, so it is
unit-tested without a database.

Thanks to Jieiku and xet7 !

Closes #3461,
2026-09-10 20:07:59 +03:00
Lauri Ojansivu a5ebb51afe CHANGELOG: add the quick-add-card bracket label syntax entry (#3986). 2026-09-10 20:07:19 +03:00
Lauri Ojansivu 904f1f0c15 Add #3256 (hot-area image map visualization) to TODO Later.
A request for a wholly new board-visualization mode - upload a custom
background image, overlay a coordinate grid, place card markers on it -
that is a genuinely different data model and rendering approach from
WeKan's existing list/swimlane structure, not a small extension of an
existing pattern. Needs a maintainer scope decision before any
implementation is worth starting.
2026-09-10 20:06:39 +03:00
Lauri Ojansivu bc699ab43b Add quick-add-card bracket label syntax, e.g. [Fedora] Do a thing.
Typing a title starting with "[LabelName] " in the quick-add-card composer
at the bottom of a list now applies that label to the new card - creating
the label on the board first, with the same default-color pick "Add label"
uses, when no label with that name exists yet (case-insensitive match).
Only a single bracket prefix at the very start of the title is parsed; an
empty bracket, nested brackets, or a bracket with nothing left after it is
left as literal title text.

The parsing and label-resolution logic lives in the new pure module
models/lib/quickAddCardLabel.js (parseQuickAddCardLabel,
findExistingLabelIdByName, pickDefaultLabelColor), wired into addCard in
client/components/lists/listBody.js. tests/quickAddCardLabel.test.cjs covers
the parser (including the empty/nested-bracket/no-rest negative cases), the
case-insensitive label lookup, and the default-color fallback.

Thanks to mattdm and xet7 !

Closes #3986,
2026-09-10 20:06:23 +03:00
Lauri Ojansivu 4eb54caca8 CHANGELOG: global admin board takeover, and #3249's other three asks.
Thanks to relikd and xet7 !
2026-09-10 20:05:47 +03:00
Lauri Ojansivu 475f14c4a1 Make board search also match text inside card comments.
Board.searchCards() (used by the sidebar search and the per-list quick
search) only matched a card's title, description and custom fields via
buildCardSearchOr(). Card comments live in a separate CardComments
collection, so they were never searched at board level, even though
global search (server/publications/cards.js) already matches comment
text.

Add matchingCommentCardIds() to models/lib/cardSearch.js: given the
board's comments (as plain { cardId, text } pairs) and the search term,
it returns the de-duplicated card ids whose comment text matches,
reusing the same case-insensitive RegExp matching rule as the rest of
the search. Board.searchCards() now pulls the board's comments via
ReactiveCache.getCardComments (works the same on client Minimongo and
server Mongo) and ORs the matching card ids into the existing query.

Thanks to javiloncho and xet7 !

Closes #3841,
2026-09-10 20:05:23 +03:00
Lauri Ojansivu 64b79fb482 CHANGELOG: add the swimlane-scoped custom-field sum badge entry.
Fixes #3319,
2026-09-10 20:04:52 +03:00
Lauri Ojansivu 943e1c4a5f CHANGELOG: add the archived-subtasks-stay-visible entry (#3409). 2026-09-10 20:04:42 +03:00
Lauri Ojansivu 68f8b5a86c Add regression coverage for the "Remove all labels" rule action.
Pins models/cards.js Card.removeAllLabels() ($set labelIds to []),
server/rulesHelper.js wiring the removeAllLabels actionType to it, and
the Rules UI's js-add-removealllabels-action handler/button, plus the
removeAllLabels() no-label-subfield behaviour and its no-op-on-empty
semantics.
2026-09-10 20:04:22 +03:00
Lauri Ojansivu 4d9282359e Let a global Admin Panel admin edit/delete any board, not only their own.
A board's own admin/member could leave the organization (or be removed)
and leave nobody - not even a global site admin - able to edit its
settings, add members to it, or archive/delete it: Boards.allow's
update/remove rule only checked board.hasAdmin(userId) against the
board's own member list. inviteUserToBoard already had a bypass for
Meteor.user().isAdmin; the whole-board update/remove rule did not.

server/lib/utils.js gets isBoardAdminOrSiteAdmin (pure, unit-tested) and
allowIsBoardAdminOrSiteAdmin (the async Meteor.users-aware wrapper), and
server/permissions/boards.js's update/remove rules now use it instead of
the board-only allowIsBoardAdmin. Scoped to the whole-board rule only -
the narrower rules/actions/triggers/comments allow rules keep the
board-only check, pinned by a negative test.

Thanks to relikd and xet7 !
2026-09-10 20:04:07 +03:00
Lauri Ojansivu 4de77a4a5b CHANGELOG: repoint the content-type spoofing entry at its own commit. 2026-09-10 20:03:09 +03:00
Lauri Ojansivu e643f0da71 Add a direct card link and {card}/{cardLink}/{list}/{board}/{member}
template tokens to the Rules "send an email" action.

The "send an email" rule action sent a bare message with no reference to
the card that triggered it - no title, no link, and no way to pull in the
list, board or triggering member. performAction() already builds a
ruleVars map and substituteVars() already replaces {name} tokens in email
subject/body (added for #2475), so this extends that existing mechanism
rather than building a new one:

- {cardLink} resolves via Card.absoluteUrl() (models/lib/cardUrl.js), the
  same helper card activity notification emails already use, so no new
  URL-building code is needed.
- {member} resolves the activity's memberId (the member added/removed/
  etc.) falling back to the acting user when the activity records none.
- {card}/{list}/{board} are short aliases of the existing cardname/
  listname/boardname/username variables, documented next to the email
  fields via a new r-email-vars-hint hint text so the tokens are
  discoverable without external docs.
- Independently of any template the user configures, the card's title and
  link are now always appended to the sent email body, so #3301's core ask
  (a direct link to the card) holds even for a rule someone set up before
  this change with no tokens at all.

substituteVars() moves out of server/rulesHelper.js into a new pure
models/lib/ruleVarsSubstitute.js so it can be unit tested directly, the
way models/lib/cardUrl.js next to it already is; tests/ruleEmailVars.test.cjs
covers token substitution (including case-insensitivity, unknown tokens
left as literal text, and malformed braces not being mistaken for tokens),
the automatic card-link footer, and that the new hint text is present and
translated.

Thanks to vossilius and ivan-paleo and xet7 !

Closes #3304,
Closes #3301,
2026-09-10 20:02:54 +03:00
Lauri Ojansivu 9b03e77de0 Validate an uploaded attachment/avatar's real content type against its
declared MIME type, and reject a dangerous mismatch (e.g. an executable
or script renamed with an image/document extension).

Restores the code from an earlier local commit (61e857d96) that a later
concurrent "Update changelog." commit (715140a2bb) accidentally reverted
by committing a stale working tree - CHANGELOG.md's entry for this
already points at 61e857d96, which still contains the original change
in its tree; this recreates it in the current tree so HEAD is not
missing the guard it documents.

fileValidation.js already sniffed content for dangerous HTML/SVG/XML
markup, but a spoofed executable (a Windows PE .exe, an ELF binary, a
Mach-O binary, or a shell/batch script) disguised with an image or
document extension and Content-Type passed through untouched, since
those binary formats were never on the dangerous-MIME deny-list.

models/lib/uploadContentMismatch.js is a pure decision module (no
server, no I/O) that flags only a MEANINGFUL, dangerous mismatch:
content that magic-byte-sniffs as executable/script while the client
declared an image/document/text/audio/video/archive type. It
deliberately does not flag compatible textual differences (text/plain
vs text/csv) to avoid false-positive breakage of legitimate uploads,
and does not flag an executable honestly declared as one (the
allow-list already governs whether executables are allowed at all).

fileValidation.js's isFileValid() - the single choke point already used
by both models/attachments.server.js and models/avatars.server.js - now
sniffs the file's real type with the `file-type` package (already a
dependency, MIT-licensed, used the same way for extension correction in
models/lib/fileTypeCorrection.js) and rejects a dangerous mismatch,
logging the blocked attempt to Admin Panel -> Problems under the
existing 'file.mime' security-log key (CWE-434, MimeBleed). Logging is
wrapped so a detection failure can never block a legitimate upload or
break the guard.

tests/uploadContentMismatch.test.cjs unit-tests the pure decision
function directly: positive cases for legitimate uploads of each
declared type, negative cases for a PE/.exe, an ELF binary, a Mach-O
binary and a shell/batch script each disguised with an image or
document type, and a search across models/ and server/ proving no
other module re-implements its own bypassing magic-byte check and that
both upload paths (attachments, avatars) go through the same guard.

Thanks to blaggacao and xet7 !

Closes #3274,
2026-09-10 20:02:50 +03:00
Lauri Ojansivu f4af25ee22 Extract the checklist-template append/copy document builders as pure functions, with tests.
models/lib/checklistTemplateCopy.js pulls the "copy a checklist/item
document onto another card" logic out of Checklists.copy() /
copyAllFromCardToCard() (#4017) into plain, Meteor-free functions -
the same split already used for subtask copying
(models/lib/subtaskCopy.js) and bulk checklist-item text editing
(models/lib/checklistItemsAsText.js) - so the copy semantics are unit
tested directly: the copy reproduces the source's checklist/item
content, drops the source _id (a fresh one is assigned on insert),
re-homes onto the destination card/board, places an appended checklist
after the target's own (existing checklists are read but never
mutated), and forces a copied item unchecked when resetChecked is set
while leaving the default (ordinary "Copy Checklist" / card copy)
behaviour unchanged. Checklists.copy() and copyAllFromCardToCard() now
call these builders instead of repeating the field-by-field copy
inline; behaviour is unchanged (the full node suite's existing
checklist tests still pass).

Thanks to Th0mas89 and xet7 !
2026-09-10 20:02:49 +03:00
Lauri Ojansivu b751a24ca3 Update changelog. 2026-09-10 20:02:00 +03:00
Lauri Ojansivu 0d91460c39 CHANGELOG: add the attachment content-type spoofing guard entry (#3274). 2026-09-10 20:01:37 +03:00
Lauri Ojansivu 715140a2bb Update changelog. 2026-09-10 20:01:17 +03:00
Lauri Ojansivu 61e857d96e CHANGELOG: add the "Remove all labels" rule action entry. 2026-09-10 20:00:44 +03:00
Lauri Ojansivu fa71c8ba4d Add the shared label-text resolution helper and its unit test (#4256).
Completes the per-board default / per-user override for minicard label
text: models/lib/labelTextVisibility.js is the pure resolution function
(user override > board setting > historical default) that
client/lib/minicardLabelText.js now calls instead of duplicating the same
three-way decision, and tests/labelTextVisibility.test.cjs pins all three
cases plus the migration-safety case (an existing board/user with nothing
stored still shows label text). server/models/boards.js's REST
cardSettings whitelist also gets showLabelText, matching every other
board-level card setting there.
2026-09-10 20:00:19 +03:00
Lauri Ojansivu af847bd088 Let a Worker check/uncheck a checklist item without editing or deleting it.
A Worker's checkbox was gated behind the same canModifyCard/write check that
also gates editing and deleting a checklist item, so it never drew a
clickable box at all - the server's allow rule refused the write too. Give
checking/unchecking its own, narrower capability (like the existing
move/self-assign carve-out for cards, models/lib/workerCardWrite.js): a
Worker may $set isFinished and nothing else on a checklist item
(models/lib/workerChecklistItemToggle.js), enforced field by field in
server/permissions/checklistItems.js. The client mirrors it with
Utils.canCheckChecklistItem / the canCheckChecklistItem Blaze helper, so
client/components/cards/checklists.jade now draws the checkbox under that
helper while everything else on the row (title edit, drag handle, due-date
edit, delete) still requires the full write capability.

Thanks to mweiss237 and xet7 !

Fixes #3307,
2026-09-10 20:00:09 +03:00
Lauri Ojansivu c1da835a73 CHANGELOG: pin issue #3310's three already-working features with tests.
Thanks to Cupara and xet7 !

Fixes #3310,
2026-09-10 19:59:55 +03:00
Lauri Ojansivu 131514d614 Let Board Settings reorder the card detail view's Description, Custom
Fields, Labels, Dates and Members sections.

The opened card always rendered its sections in one fixed order, with no
way to move Description earlier or have Custom Fields follow it. Boards
now store a cardFieldOrder array; models/lib/cardFieldOrder.js resolves it
against the historical default order, dropping unknown keys and filling in
any missing section so a stale or partial value can never hide or
duplicate a section. cardDetails.jade renders these five sections from
that resolved order instead of a hardcoded sequence, each now its own
template (cardFieldSectionLabels, ...Dates, ...Members,
...CustomFields, ...Description) included from an each loop; Dependencies
+Sort stay a fixed appendage right after Members and Vote+Poker stay one
right after Custom Fields, so a board that never touches the setting
renders exactly what it always did. Checklists, Attachments and Activity
are left out of this pass - they sit in their own flex/right-column
layout further down the template, and moving them was not needed for the
issue's ask (move Description earlier, custom fields after it) and would
add layout risk this environment cannot verify visually.

Board Settings / Card Settings gets a new "Card field order" list with
up/down buttons per row. Up/down rather than a drag library: this
codebase's existing jQuery-ui-sortable usages (list/swimlane/board
reordering) are heavier drag-and-drop over board layout, not a simple
settings list, so buttons are the simpler, safer mechanism here.

Thanks to mimZD and xet7 !

Closes #4448,
2026-09-10 19:59:53 +03:00
Lauri Ojansivu 59f7d61df7 CHANGELOG: add the People "Last active" presence entry for #3678, #3734. 2026-09-10 19:59:36 +03:00
Lauri Ojansivu bcd00c09b5 Add a "Remove all labels" rule action.
WeKan's IFTTT-style Rules already had per-label "add label X" / "remove
label X" card actions (models/cards.js addLabel/removeLabel, wired in
server/rulesHelper.js and the label dropdown in
client/components/rules/actions/cardActions.jade/.js). Removing every
label from a card required one "remove label" action per label.

Card.removeAllLabels() sets labelIds to an empty array in one update
(a card with no labels is a no-op), and a new "Remove all labels" rule
action (actionType 'removeAllLabels', no label-selection sub-field)
calls it from a new dropdown entry next to the existing label actions,
mirroring the existing "Remove all members" action's wiring.

Thanks to basketball00011 and xet7 !

Closes #3432,
2026-09-10 19:59:28 +03:00
Lauri Ojansivu 1c97bbac85 Add a "Remove all labels" rule action.
WeKan's IFTTT-style Rules already had per-label "add label X" / "remove
label X" card actions (models/cards.js addLabel/removeLabel, wired in
server/rulesHelper.js and the label dropdown in
client/components/rules/actions/cardActions.jade/.js). Removing every
label from a card required one "remove label" action per label.

Card.removeAllLabels() sets labelIds to an empty array in one update
(a card with no labels is a no-op), and a new "Remove all labels" rule
action (actionType 'removeAllLabels', no label-selection sub-field)
calls it from a new dropdown entry next to the existing label actions,
mirroring the existing "Remove all members" action's wiring.

Thanks to Southclaws and xet7 !

Closes #3432,
2026-09-10 19:59:11 +03:00
Lauri Ojansivu 2ccd70f452 Add regression tests confirming issue #3310's three feature requests already work.
Issue #3310 (2020) asked for three things. Reading the current code shows all
three are already implemented, some in a stronger form than requested:

1. Invite code management from the Admin Panel: superseded by "Invite via
   Email" in Admin Panel -> Settings (settingBody.js), which calls the
   sendInvitation server method to generate and email a per-invitee code
   (icode), validated at sign-up (server/models/users.js) - an admin-driven
   per-person code rather than the single static field the report found.
2. Admin ability to delete a user account: Admin Panel -> People already has
   this. Each row's "more settings" link opens the settingsUser popup
   (Popup.open("settingsUser") -> template settingsUserPopup), whose
   #deleteButton calls the removeUser server method.
3. Anonymous viewing of public boards: a board's own URL (/b/:id,
   /b/:id/:slug) carries no sign-in trigger in the router, and the board
   publication's visibility selector already includes { permission: 'public' }
   for a subscriber with no userId at all (models/lib/boardVisibilitySelectors.js).

No behaviour changed; tests/issue3310FeatureRequests.test.cjs pins all three.

Thanks to Cupara and xet7 !

Fixes #3310,
2026-09-10 19:59:10 +03:00
Lauri Ojansivu 520b2e412e Add Admin Panel / People "Last active" presence for #3678 and #3734.
Both issues ask the same question: which users are actively using WeKan,
and for how long. The `lastConnectionDate` field already existed on the
user schema but was only ever written from a commented-out, env-gated
block in server/publications/users.js - so WeKan never actually recorded
it. Accounts.onLogin now stamps it on every successful login
(server/lastActiveOnLogin.js), and an open client session refreshes it
every two minutes via a `usersHeartbeat` method
(client/lastActiveHeartbeat.js, server/methods/lastActiveHeartbeat.js) -
a periodic timestamp, not a WebSocket/real-time presence system, which is
more than either issue asked for.

Admin Panel / People gets a "Last active" column showing each user's
timestamp with an online-now badge when it is within five minutes
(models/lib/lastActive.js holds the pure recency check, reused by the
unit test). "Last active" and "Online now" are added to en.i18n.json and
translated into 203 other locale files; the remaining minority keep the
English source as the untranslated-everywhere placeholder.

Thanks to eccaw and xet7 !

Closes #3678,
Closes #3734,
2026-09-10 19:59:02 +03:00
Lauri Ojansivu 2b8762baf0 CHANGELOG: repoint commit link after history moved. 2026-09-10 19:57:22 +03:00
Lauri Ojansivu bc91db9e27 Add Open Graph meta tags to public card pages for link previews.
A card URL pasted into Discourse, Slack, Discord etc. now renders an inline
preview: a connect middleware sets request.dynamicHead (the same injection
point Meteor's WebApp boilerplate generator already supports, following the
precedent in server/routes/customHeadAssets.js) with og:title,
og:description, og:url and og:image tags for the '/b/:boardId/:slug/:cardId'
route, before Meteor's normal SPA shell is served. The tags are only ever
built when the card's board is public (board.isPublic()) - a private board's
card serves the normal, unmodified page, since an unfurl request carries no
auth. The gating and rendering logic lives in server/lib/cardOgTags.js as a
Meteor-free pure module with unit + negative test coverage.

Thanks to yelloff and xet7 !

Closes #3456,
2026-09-10 19:56:48 +03:00
Lauri Ojansivu 35a4d62d76 CHANGELOG: repoint the card Open Graph tags entry's commit link after history moved. 2026-09-10 19:56:34 +03:00
Lauri Ojansivu 7670bc3315 Update changelog. 2026-09-10 19:56:16 +03:00
Lauri Ojansivu 3f4c5e68c9 Let a checklist template's items be appended onto an existing card.
Checklists.copy() now takes an options.resetChecked flag so a copied
item can be forced unchecked regardless of its source isFinished state,
and a new Checklists.copyAllFromCardToCard(sourceCardId, targetCardId)
appends every checklist of a source (e.g. template) card onto a
destination card's existing checklists, in source order, without
touching what is already there. Both are used by the new "Copy
Checklist From Template" card action (client/components/cards/checklists.js
and .jade), which reuses the same board/swimlane/list/card picker as
Move/Copy Checklist.

Thanks to Th0mas89 and xet7 !

Closes #4017,
2026-09-10 19:55:37 +03:00
Lauri Ojansivu 00b808cc3e Update changelog. 2026-09-10 19:54:38 +03:00
Lauri Ojansivu d5700f5c39 Add a multi-select dropdown custom field type, storing several chosen options.
The existing "Dropdown" custom field type only ever stored one selected
option. Add "dropdownMultiSelect" (models/customFields.js), reusing the
exact same settings.dropdownItems option-list definition mechanism and its
Board Settings editing UI (client/components/sidebar/sidebarCustomFields.js/
.jade) - only the value stored on a card differs: an array of selected item
ids instead of a single one.

On a card, the new type renders as a checkbox list (reusing the app's
existing toggle-checkbox interaction rather than a <select multiple>), and
its value round-trips through Cards.setCustomField() the same way
stringtemplate's own array value already does
(client/components/cards/cardCustomFields.js/.jade).

models/lib/customFieldsWD.js's resolveTrueValue() now resolves a
dropdownMultiSelect's array of ids to the matching item NAMES, joined for
display, so every place that already read a dropdown's trueValue (the
minicard badge, the CSV/PDF/Excel exporters) shows the new type correctly
without further changes there. The CSV/PDF/Excel exporters and csvCreator's
CSV header/definition parsing are updated to resolve
dropdownMultiSelect's array-of-ids the same way the single-select dropdown
already resolves its single id.

Thanks to huma2000 and xet7 !

Closes #4166,
2026-09-10 19:54:38 +03:00
Lauri Ojansivu ae2cb6fab4 CHANGELOG: My Cards now opens a card in the popup, not the board. 2026-09-10 19:53:40 +03:00
Lauri Ojansivu dcbb1ed693 CHANGELOG: bulk-editing a checklist's items as plain text. 2026-09-10 19:53:25 +03:00
Lauri Ojansivu c7db5429bb Open a card from My Cards in the popup, not a full board navigation.
My Cards spans many boards, so its card links were a plain
`a.minicard-wrapper(href=card.originRelativeUrl)` with no click handler.
Clicking one followed the href and navigated the whole browser to that
card's own board, losing the user's place in the cross-board My Cards list.

Fix it by reusing the mechanism the app already uses for opening a card
from other cross-board contexts - global search results
(client/components/cards/resultCard.js) and the Board Table view's Edit
link (client/components/boards/tableView.js): intercept the click,
subscribe `popupCardData` for that card, set the `popupCardId` /
`popupCardBoardId` Session variables, and open the shared `cardDetails`
popup in place. The `href` stays on the link so middle-click/ctrl-click
and a no-JS fallback keep working.

Thanks to javen9881 and xet7 !

Fixes #3640,
2026-09-10 19:53:06 +03:00
Lauri Ojansivu e169cc8017 Update changelog. 2026-09-10 19:52:56 +03:00
Lauri Ojansivu bed9bce312 Let a checklist's items be bulk-edited as plain text, one line per item.
A checklist could previously only be edited one item at a time through its
per-item HTML row - reordering, copying between checklists/cards, or a bulk
rewording meant a click-drag or a click-edit-save per item. WeKan already
had "one line = one new item" for ADDING items (the newline-becomes-item
toggle), but nothing let a user rewrite the items an existing checklist
already has as one text block.

Adds "Edit as text" to a checklist's actions menu (alongside Export/Import,
Delete, Move, Copy). It opens a textarea pre-filled with the checklist's
current items, one per line, using the Markdown-checklist convention
`[x] Done item` / `[ ] Todo item` for checked state (a plain line with no
marker defaults to unchecked, so text pasted from elsewhere still works).
Saving replaces the item list with what was typed, in that order.

The parsing and the replace-plan are pure functions
(models/lib/checklistItemsAsText.js): checklistItemsToText/
parseChecklistItemsText convert between the textarea's text and
{title, isFinished} objects, and planChecklistItemsTextUpdate matches each
parsed line against the checklist's current items by unchanged title text
(consumed top-to-bottom, so reordered duplicates still pair 1:1) - a match
KEEPS that item's existing document (only sort/isFinished change), so any
other metadata on it, notably the #4755 due date, survives an edit that
doesn't touch its text. Only a line whose title has no remaining match
becomes a new item, and only an existing item whose text is gone from the
new text is removed.

Thanks to gerroon and xet7 !

Closes #4218,
2026-09-10 19:52:40 +03:00
Lauri Ojansivu acf505a5c9 CHANGELOG: add the opt-in Jalali calendar date display.
Thanks to mimZD and xet7 !

Closes #4335,
2026-09-10 19:52:15 +03:00
Lauri Ojansivu 8c7345ace6 Register the Bigboard view's templates and add its regression test.
client/features/boards.js explicitly imports every board view's jade/js/
css (Meteor does not auto-load client files here) - bigboardView.jade/
.js/.css were missing from that list, so the new view could not have
rendered. Add them next to the other board views.

Extend tests/boardViewMenu.test.cjs's VIEWS table with the new entry so
every existing wiring check (menu order, icon, click handler, isView*
helper + boardBody.jade branch, the anonymous-user whitelist, the
en.i18n.json label, profile.boardView's allowedValues, the tooltip name
map, and the "templates are registered" check) covers Bigboard the same
as the other 19 views.

"Bigboard" is a proper noun (Kanboard's plugin of the same name), like
"Gantt"/"Frappe Gantt" already are - add it to fill-translations.mjs's
isInvariantSource() allowlist so it is not flagged as an untranslated
string in any locale.

Thanks to Jieiku and xet7 !
2026-09-10 19:51:57 +03:00
Lauri Ojansivu fb761c7f10 Update changelog. 2026-09-10 19:50:55 +03:00
Lauri Ojansivu 84284a8a5e Update changelog. 2026-09-10 19:50:39 +03:00
Lauri Ojansivu 0e7a648464 Show a card's comments directly on the minicard.
Board Settings / Card gets a new "Comments on minicard" row, following the
same allowsX/allowsXOnMinicard pattern as every other Card Settings toggle
(e.g. Received date). It is opt-in and OFF by default
(allowsCommentsOnMinicard), so existing boards are unaffected.

When enabled, the minicard shows up to 3 of the card's most recent
comments, each truncated to 140 characters, reusing the same comments()
card helper the existing comment-count badge already calls - no new
subscription. A "more" affordance appears when there are more comments
than shown or a comment got truncated; it relies on the minicard already
being a link to the full card (client/components/lists/listBody.jade's
a.minicard-wrapper.js-minicard) rather than adding an in-place expand
interaction - display only, no reply/edit from the minicard.

Thanks to Meeques and xet7 !

Closes #4285,
2026-09-10 19:50:34 +03:00
Lauri Ojansivu f8ab84c67b CHANGELOG: add the custom-fields drag-and-drop display order. 2026-09-10 19:50:16 +03:00
Lauri Ojansivu 9b1a90239b Add a "Link to board" action to the card hamburger menu.
Cards.helpers().link(boardId, swimlaneId, listId) already created a
linked-card mirror on a different board, and cardDestinationPicker already
gave Move/Copy card a board/swimlane/list chooser, but nothing let a user
create a link from the card's own hamburger menu to an EXISTING board -
only the list's "search/insert as link" composer could do that, and only
into the current board. A new linkCardToBoardPopup, wired next to Move
card/Copy card, reuses both: it opens the same picker and calls the
existing card.link() on Done, never mutating the original card.

Thanks to HT-Marley and xet7 !

Closes #4281,
2026-09-10 19:49:48 +03:00
Lauri Ojansivu e85cf0f0ad CHANGELOG: add the Authelia OAuth2/OIDC example configuration.
Thanks to tamaskan and xet7 !

Closes #4210,
2026-09-10 19:49:37 +03:00
Lauri Ojansivu 0c6901f3a9 Add a user-settable display order for custom fields, via drag-and-drop.
Custom fields rendered alphabetically by name everywhere - the board
settings sidebar list and every card - with no way to change it, so users
worked around it by prefixing names with numbers (#4165).

Add a numeric `sort` field to the CustomFields schema (optional, so fields
created before this exist keep sorting by name as a fallback). The board
settings sidebar list (client/components/sidebar/sidebarCustomFields.jade/js)
gets a drag handle and jQuery-ui sortable, mirroring the card-labels popup's
own reordering (client/components/cards/labels.js) - the smallest existing
pattern for a short settings list that rewrites its whole order on drop.
Dropping recomputes sequential `sort` values with computeSortIndexMapping(),
the same pure helper the All Boards page already uses for its own
drag-reorder (models/lib/boardSortReorder.js), so no new reordering logic
was added. A newly created field defaults to the end of the board's current
list (the count of existing fields), not the top.

models/lib/customFieldsWD.js - the shared matcher that builds a card's
custom-field list from its board's definitions - now sorts by `sort`
ascending instead of by name, falling back to name for fields with no
`sort` yet. This is the one place both the card detail view and the
card's custom-fields popup get their order from, so no other rendering
path needed changes.

Thanks to huma2000 and xet7 !

Closes #4165,
2026-09-10 19:49:28 +03:00
Lauri Ojansivu 87c1e82ec7 Add example Authelia OAuth2/OIDC configuration for Wekan login.
Add docs/Features/Login/Authelia.md with Snap and Docker settings mapped
to Authelia's OIDC endpoints (authorization_endpoint, token_endpoint,
userinfo_endpoint under /api/oidc/*, from Authelia's own OIDC docs),
matching the format already used for Keycloak and Zitadel, and note that
Authelia does not yet implement RP-Initiated Logout so OAUTH2_LOGOUT_ENDPOINT
should stay unset for it. Also linked from docs/README.md's Login Auth list,
the OAuth2 providers list in docs/Features/Login/OAuth2.md, and given the
same commented OAUTH2_* example block in docker-compose.yml and every other
docker-compose-*.yml variant that carries the OAuth2 examples.

Thanks to tamaskan and xet7 !

Closes #4210,
2026-09-10 19:49:01 +03:00
Lauri Ojansivu 30598910ce CHANGELOG: subtask completion counter is already correct (#4050).
Thanks to ufalke and xet7 !

Fixes #4050,
2026-09-10 19:48:45 +03:00
Lauri Ojansivu 09fb0cb07f Update changelog. 2026-09-10 19:48:11 +03:00
Lauri Ojansivu 2bc82f9ff5 Pin correct subtask completion-counter behaviour for #4050.
The reporter saw the minicard subtask badge stay at "0/n" after giving a
subtask an End Date, and expected that to count as "done". Reading
models/cards.js shows the counter is not broken: subtasksFinishedCount()
counts subtasks with archived: true (the numerator), allSubtasksCount()
counts every subtask regardless of archived state (the denominator), and
Card.archive() - the actual "finish a subtask" action - sets that flag and
recurses into children. setEnd(endAt) only ever writes { endAt }; it never
touches archived, by design, since an end date is a due-date field, not a
completion flag. Archiving a subtask does correctly increment the badge.

Added a regression test that pins this: the numerator/denominator source,
that archiving M of N subtasks yields M/N, and a negative case that setting
only an end date leaves the count at 0/n.

Thanks to ufalke and xet7 !

Fixes #4050,
2026-09-10 19:48:08 +03:00
Lauri Ojansivu 5323fdbce6 Add a "Bigboard" board view listing every board at once (#4223).
Add "Bigboard" to the Board View menu, right after Dashboard, matching
the existing 19-entry pattern (menu row in boardHeader.jade, click
handler + boardViewName() entry in boardHeader.js, isViewBigboard()
helper + boardBody.jade branch, the two whitelist arrays in
client/lib/utils.js, and profile.boardView's allowedValues in
models/users.js).

Unlike the other views, Bigboard renders every board the current user
is a member of, not just the open one - the same idea as Kanboard's
BigBoard plugin. The new bigboardView template (bigboardView.jade/js)
queries the user's boards with the same membership selector the All
Boards page uses, subscribes each one's lists/swimlanes/cards through
the existing 'board' composite publication, and stacks each board as
its own section reusing the existing listsGroup/list/card templates -
so editing, dragging and opening a card behave exactly as on a normal
board page.

Rendering several boards' lists on one page at once exposed a bug the
single-board case never could: list drag-and-drop connects via a plain
'.js-swimlane, .js-lists' jQuery UI sortable selector, which would let
a list be dragged out of one board's section into another's now that
more than one board's lists share a page. Added a data-board-id
attribute to the swimlane/listsGroup root elements and a
connectWithSelector() helper (swimlanes.js) that scopes the connect
selector to the dragged list's own board id when one is present -
ordinary single-board views still have exactly one board id on the
page, so their behaviour is unchanged.

Thanks to Jieiku and xet7 !
2026-09-10 19:47:26 +03:00
Lauri Ojansivu a83a8a2cfa Let a card create and link to a brand-new board, in one step.
Previously, linking a card to a board required first creating the board
separately and then using the existing "Link to board" action to find it.
Add a new, adjacent action to the card's hamburger menu, "Create board from
this card", that prompts for the new board's title (defaulting to the
card's own title), creates the board the same way normal board creation
does, and links the current card to it - setting the exact same
type/linkedId fields the existing "link to a whole board" flow sets - all
without leaving the card.

The new server method, createBoardFromCard, refuses to convert a card that
is already a link or a template, and requires write access on the card's
own board before creating anything.

Thanks to Xilef11 and xet7 !

Closes #4495,
2026-09-10 19:47:19 +03:00
Lauri Ojansivu 17c6d8d9b9 Update changelog. 2026-09-10 19:47:15 +03:00
Lauri Ojansivu 52972b3e4c Add Admin Panel setting to restrict board creation to admins only.
Admin Panel -> Settings -> Visibility gets a new checkbox beside "Public
boards": "Only admins can create boards"
(tableVisibilityMode-boardCreationAdminOnly, off by default). It follows
the exact TableVisibilityModeSettings pattern its sibling
tableVisibilityMode-allowPrivateOnly already uses: a collection doc seeded
in server/models/collectionBootstrap.js, a jade checkbox and reactive
helper in settingBody.jade/js, and a write in the section's own Save
handler.

The real enforcement is server-side: createBoardWithInitialSwimlanes
(server/models/boards.js) now rejects the call with a not-authorized error
when the setting is on and the caller is not isAdmin === true, before the
board is ever inserted. The client mirrors this only as a convenience - a
new client/lib/boardCreationAllowed.js helper hides the top-bar "+" (header
header.js/.jade) and the All Boards "Add board" tile (boardsList.js) for a
restricted non-admin, but nothing depends on that for security.

A full per-user allow/deny override was left out of this pass: it would
need is own schema field, a People/Admin Panel UI to flip it per account,
and server enforcement layered under the global toggle, which is a larger
change than this issue's "let an admin forbid board creation instance-wide"
core request. The global toggle covers that request cleanly on its own.

Added imports/i18n/data/en.i18n.json's board-creation-admin-only string and
a direct translation (no external translation API) in all other locale
files, in en.i18n.json's key order. tests/boardCreationAdminOnly.test.cjs
pins the default-off setting, the checkbox/handler wiring, the server-side
admin check (and that it runs before the insert), the shared client helper,
the i18n key placement, and - as a negative test - that no OTHER
Boards.insertAsync call site was silently added outside the two already
known and deliberately ungated ones (the per-user Templates container and
createBoardFromCard).

Thanks to belf88 and xet7 !

Closes #4475,
2026-09-10 19:45:52 +03:00
Lauri Ojansivu f988650de7 Update changelog. 2026-09-10 19:45:23 +03:00
Lauri Ojansivu 18c6f26c9a Update changelog. 2026-09-10 19:44:18 +03:00
Lauri Ojansivu a033ed28aa Add regression coverage for "Clone Board without cards".
Board cloning gained an opt-in "Without cards" checkbox (see commit
d4876eca3, which carries this fix's code alongside an unrelated
changelog entry due to this checkout being shared with other
concurrent work) that threads a withoutCards flag from the Clone
Board popup through copyBoard, Boards.helpers().copy() and
Swimlanes.helpers().copy() down to the single place cards are
actually copied. This pins: the i18n key exists in English and every
locale, the flag defaults to false so unchecked cloning is unchanged,
the per-list card-copy loop is the one gated call site (a negative
check that no second, unguarded card.copy() sneaks cards back in),
and the client popup/checkbox wiring passes withoutCards through to
the Meteor call.

Thanks to e-gaulue and xet7 !

Closes #4726,
2026-09-10 19:43:28 +03:00
Lauri Ojansivu d4876eca3b CHANGELOG: add the Group by Assignee board view.
Thanks to xet7 !
2026-09-10 19:42:08 +03:00
Lauri Ojansivu 8dad0d0506 Add a "Group by Assignee" board view for team-meeting-friendly overviews.
Group cards by assignee, clustered under each assignee's name as a
heading, for a read-only overview well suited to a team stand-up. A
card with several assignees appears under each; a card with none falls
into "No assignee". Reuses the same grouping/translation fold the
Dashboard and Time views already use (models/lib/chartCalculations.js's
NO_ASSIGNEE_GROUP/translateGroupLabel), now generalized into
computeCardsByAssigneeGroup, which returns the grouped cards themselves
rather than a count/hours total. Wired end to end like every other
board view: a "Group by Assignee" Board View menu entry, an
isViewGroupByAssignee() helper/boardBody.jade branch, the
client/lib/utils.js whitelist, the profile.boardView schema, and a
tooltip-name-map entry. Each card row is a simple title + due date +
overtime marker, deliberately not a minicard re-render, and clicking a
card navigates to it like any other view - no drag-and-drop, no export.

Thanks to xet7 !

Closes #4688,
2026-09-10 19:41:33 +03:00
Lauri Ojansivu 0297f52c4b Filter Admin Panel / People by Team.
An admin with several teams (19 users, 6 teams in the report) could not narrow
the People list to one team's members - only the existing Show filter
(All/Locked/Active/Inactive/Admin) and the free-text search box. A user's team
membership already lives in their own `teams` array (models/users.js,
`teams.$.teamId`), so the People pane's controls row gets a second dropdown,
Team, built from every team and matched against that field the same way Show
already narrows the query. Both dropdowns share `.js-table-page-filter`; a
`data-filter` attribute (already emitted by the shared table page for each
filter) tells the change handler which ReactiveVar to update.

Thanks to hesco and xet7 !

Closes #4510,
2026-09-10 19:40:25 +03:00
Lauri Ojansivu 9fd49150eb CHANGELOG: board filters can now be driven by URL query parameters.
Thanks to thrademaker and xet7 !

Closes #4540,
2026-09-10 19:39:35 +03:00
Lauri Ojansivu 963b01ff5b Let a board's filter state be driven by URL query parameters.
?assignee=johndoe, ?member=janedoe and ?label=urgent now pre-filter a board
on load, reusing the existing Filter sidebar object/API rather than a new
filtering engine - useful for embedding a pre-filtered board view in another
tool (e.g. an iframe). Query params are parsed once, when the board
subscription becomes ready (client/components/boards/boardBody.js), and
resolved to member/assignee ids by username and to label ids by name via
client/lib/filterQueryParams.js, a pure module covered by
tests/filterQueryParams4540.test.cjs. This only reads params on load; it does
not sync the URL back as filters change.

Thanks to thrademaker and xet7 !

Closes #4540,
2026-09-10 19:38:53 +03:00
Lauri Ojansivu 187471e661 Update changelog. 2026-09-10 19:37:26 +03:00
Lauri Ojansivu 7deb081713 Update changelog. 2026-09-10 19:37:13 +03:00
Lauri Ojansivu 612be13763 Add a permalink to comments and activities.
Clicking a comment's or an activity's timestamp now links to a
shareable permalink - the card's own URL plus a #comment-<id> or
#activity-<id> fragment. Visiting that link loads the card and then
scrolls to and briefly highlights the matching comment or activity,
reusing the existing swimlane/list reveal-on-load mechanism
(models/lib/revealBoardItem.js, client/lib/revealBoardItem.js),
extended here to read the two new kinds from the URL hash instead of
a route param. A small icon next to the timestamp copies the same
URL to the clipboard, reusing the existing copyTextToClipboard/
showCopied pattern already used for card/list/swimlane links.

Thanks to xet7 !

Closes #4757,
2026-09-10 19:36:48 +03:00
Lauri Ojansivu bf3328567f Update changelog. 2026-09-10 19:35:40 +03:00
Lauri Ojansivu c7bf50deb4 Add due dates for individual checklist items.
Checklist items only ever inherited the card's own due date; there was no way
to give one item its own deadline. ChecklistItems now has an optional dueAt
field, plus getDue/setDue/unsetDue helpers that mirror Cards' own due-date
methods exactly. Each item row shows a small clock-icon trigger (or, once a
due date is set, a compact badge) that opens a date/time picker - reusing the
same dateBadgeBody/editDateForm markup and datePickerEvents the card's own
due-date popup already uses, so nothing new was added to the date-picker
stack. An item whose due date has passed turns red via the same dueDateClass
decision the card's own badges use. No new translation key was needed:
the popup title and badge tooltip reuse the existing card-due/card-due-on/
editCardDueDatePopup-title strings.

tests/checklistItemDueDate.test.cjs pins the schema field shape, the
getDue/setDue/unsetDue methods, that the badge/popup templates exist and
reuse the shared markup rather than a new date-picker, that the popup does
not reuse the card-specific setupDatePicker helper (which would resolve the
wrong document from inside an open card dialog), that overdue styling goes
through the shared dueDateClass function, and that no member-assignment was
added alongside it.

Thanks to DimDz and xet7 !

Closes #4755,
2026-09-10 19:34:10 +03:00
Lauri Ojansivu f9d66268a0 Update changelog. 2026-09-10 19:07:49 +03:00
Lauri Ojansivu 74e4248ee9 Add a Pomodoro timer to the card detail view (#4862).
The classic Pomodoro Technique - a fixed 25-minute work interval, then a
break (5 minutes, or a longer 15-minute break every 4th completed work
interval) - as its own, separate block from the unrelated Flowtime feature
(#3919, open-ended sessions with no fixed interval): its own template,
button group and field names, sitting alongside cardFlowtime's block in
cardDetails.jade rather than replacing or restructuring it.

client/components/cards/cardPomodoro.{js,jade,css} is the new card-detail
UI: a configurable work-length input and Start Pomodoro button, a live
countdown (the same Meteor.setInterval idiom cardFlowtime.js already uses)
with a Work/Break phase label and completed-interval count, and a Stop
button. Registered in client/features/cards.js the way every other
client/components/cards/*.jade/js/css file is.

Card.completePomodoroWorkInterval() - called client-side when a work
countdown reaches zero - adds the interval's duration, in hours, into the
card's EXISTING spentTime field via the same setSpentTime() helper the
manual time-entry popup and Flowtime both already use, increments
pomodoroCount, and switches to a break interval; completing a BREAK
interval adds no time and returns to ready-to-start rather than
auto-starting the next work interval. Stop/Reset (stopPomodoro()) credits
whatever elapsed so far if stopped mid-work-interval (consistent with
Flowtime's own stopFlowSession()), adds nothing if stopped mid-break, and
clears every Pomodoro field back to its empty/null default.

Five new i18n keys (pomodoro, pomodoro-start, pomodoro-work,
pomodoro-break, pomodoro-completed) added to en.i18n.json and given a
real, direct translation - not an English placeholder - in every other
locale file, in the same key position, with the %s placeholder preserved;
the "stop" button reuses the existing generic "stop" key rather than
adding a near-duplicate.

tests/pomodoroTimer.test.cjs pins: the schema fields and methods exist and
are additive next to Flowtime's (no rename/reuse of its fields); a
completed work interval adds its duration via the existing setSpentTime()
helper and switches to break; a completed break interval adds no time and
does not auto-start the next work interval; the every-4th-interval long
break rule; the UI is wired and registered as its own block; and all
locale files carry the new keys, in order, with real translations and the
%s placeholder intact.

Thanks to xet7 !

Closes #4862,
2026-09-10 19:07:19 +03:00
Lauri Ojansivu 21c1a2f4e7 Update changelog. 2026-09-10 19:06:35 +03:00
Lauri Ojansivu 6e36dcabe5 Add an audio ding when a checklist item is checked off.
A short, synthesized Web Audio tone (OscillatorNode + GainNode envelope)
plays when a checklist item transitions from unchecked to checked, gated on
a new per-user Member Settings preference ('profile.checklistDingSound'),
off by default. The sound is synthesized rather than a bundled audio file,
since a previously proposed bundled sound was not copyfree/MIT/BSD-licensed
and was rejected for that reason.

Thanks to C0rn3j and xet7 !

Closes #5427,
2026-09-10 19:05:55 +03:00
Lauri Ojansivu cc4c1561c6 Update changelog. 2026-09-10 19:04:54 +03:00
Lauri Ojansivu d8eee59e6f Add Flowtime session tracking to card time-tracking (#3919).
Unlike Pomodoro's fixed 25-minute work/break cycle, Flowtime has no fixed
interval: you start a work session and keep going as long as you are in
flow, tally interruptions as they happen without stopping the clock, and
stop the session when the flow naturally ends.

This integrates with WeKan's existing time-tracking feature
(client/components/cards/cardTime.js/.jade, models/cards.js
setSpentTime()/setIsOvertime()) rather than being a disconnected feature,
per the issue's own "related to Timetracking #812":

- models/cards.js gains three schema fields for the in-progress session -
  flowStartAt (Date), flowInterruptions (Number), flowUserId (String) -
  and startFlowSession()/addFlowInterruption()/stopFlowSession() helpers
  that mirror the shape of the existing setSpentTime()/setIsOvertime()
  helpers. Persisting server-side (not Session/localStorage) means a page
  reload does not lose an in-progress session.
- stopFlowSession() computes the session's duration and ADDS it, in hours,
  into the card's EXISTING spentTime field via the same setSpentTime()
  the manual time-entry popup already uses, then clears the session
  fields - Flowtime feeds the same total, it does not keep a separate one.
- addFlowInterruption() only increments the tally; it does not touch
  flowStartAt, so the clock keeps running through an interruption.
- client/components/cards/cardFlowtime.{js,jade,css} is the new card-detail
  UI: a Start Flow button, a live elapsed-time readout (Meteor.setInterval,
  the same idiom client/components/settings/problemsSummary.js already
  uses) with the running interruption count, an Add Interruption button,
  and Stop Flow. Only Utils.canModifyCard() may use the controls. Wired
  into client/components/cards/cardDetails.jade next to the existing
  cardSpentTime badge, and registered in client/features/cards.js the way
  every other client/components/cards/*.jade/js/css file is (Meteor does
  not auto-load them).
- Five new i18n keys (flowtime, flow-start, flow-stop,
  flow-add-interruption, flow-interruptions) added to en.i18n.json and
  given a real, direct translation - not an English placeholder - in
  every other locale file, in the same key position, with the %s
  placeholder preserved.

tests/flowtimeSession.test.cjs pins: the schema fields and helpers exist;
the manual time-entry popup is untouched; only start/interrupt/stop write
the flow fields, each scoped to this.getRealId() (no cross-card leakage);
stopFlowSession's arithmetic adds into, rather than replaces, spentTime;
the UI is wired and registered; and all locale files carry the new keys,
in order, with real (non-English) translations and the %s placeholder
intact.

Thanks to xet7 !

Closes #3919,
2026-09-10 19:04:09 +03:00
Lauri Ojansivu 3fb89e7cd4 Update changelog. 2026-09-10 19:00:48 +03:00
Lauri Ojansivu 070a1ad10b Add hours-by-assignee/card breakdown and PDF/Excel export to Time view
#812's 39-comment thread repeatedly asked for external timesheet
integrations (Kimai, Harvest, Titra) that were never resourced - the
maintainer's own 2021 comment quotes a ~1000 EUR / 4-month estimate for a
Kimai sync, shelved shortly after. What the thread DID converge on that
fits inside WeKan itself: "reporting total hours by resource and task
type" (the issue's own words), and export - both added here without any
external service.

server/lib/boardChartData.js answers a new 'time' chartKey with
computeTimeByGroup (models/lib/chartCalculations.js: sums each card's
spentTime per assignee, not a card count - the same shape as
computeDashboardGroups but summing a value instead of counting cards) and
computeTimeByCard (one row per card with logged time, largest first),
scoped to non-archived cards like the Time view's existing summary. 'time'
is registered as a real chartKey in models/exportCharts.js and
models/lib/chartExportRows.js, so it reuses the exact same
/api/boards/:boardId/charts/:chartKey/export* PDF/Excel routes and
ExporterChartPDF/ExporterChartExcel every other board report chart already
uses - one export pipeline, not a second one just for Time. The Time board
view calls the same boardChartData method (chartKey 'time') the 10 report
charts already use and shows the same two breakdowns alongside its
existing 3-row summary, kept exactly as it was.

Thanks to xet7 !

Closes #812,
2026-09-10 19:00:20 +03:00
Lauri Ojansivu 0133fa2e0f Add #5758 (Windows SSO via node-expose-sspi) to TODO Later; remove stale #5707
#5758 needs a Windows host, node-gyp/MSVC build tools, an Active Directory
domain, and a real SSPI handshake to build or verify at all - it also sits
directly in the authentication path, where a wrong implementation done
without that environment is a security risk rather than a convenience.

#5707 already has a real fix (Admin Panel's "Invite People" form now shows
success/failure feedback) and is no longer open work.
2026-09-10 18:53:26 +03:00
Lauri Ojansivu c5a19258c3 Update changelog. 2026-09-10 18:44:46 +03:00
Lauri Ojansivu bdbfa3c2ff Update changelog. 2026-09-10 18:43:10 +03:00
Lauri Ojansivu 6fd8e787e8 Scope a board-wide list's collapse state to its own swimlane row
A list with no swimlaneId of its own (shared/pre-migration) renders once
per swimlane in Swimlanes view - the same list document, one row per
swimlane (client/components/swimlanes/swimlanes.js's `lists()` helper
already documents this: "shared / pre-migration lists (swimlaneId empty or
null)" are returned for every swimlane). Collapsing/expanding it was a
single Session/profile key keyed only by list._id, so collapsing the list
in swimlane 1's row also collapsed swimlane 2's row of the very same list.

Utils.getListCollapseState/setListCollapseState (client/lib/utils.js) now
take an optional swimlaneId and fold it into the storage key
(`${list._id}:${swimlaneId}`) used for both the Session cache and the
persisted state (the setListCollapsedState Meteor method / the anonymous
public-board cookie fallback) - a bare list._id key, used outside Swimlanes
view or when swimlaneId is absent, is unchanged, so existing stored state
still applies exactly as before. Every read/write site resolves it via the
same containerSwimlaneId pattern #6660 already established for scoping a
board-wide list's CARDS per swimlane (client/components/lists/
listHeader.js, listBody.js): walking up parent Blaze data contexts to find
the enclosing swimlane, now extracted into a shared resolveContainerSwimlaneId
function and reused by list.js's own collapsed() helper and the resize-
handle visibility logic (the latter via a View-walking variant, since it
runs from async/onCreated code with no active Blaze render for
Template.parentData() to read from).

Archive is unaffected by this: Lists.archive()/restore() already scope to
`this._id`, and a board-wide list archived from one swimlane correctly
disappears from every swimlane's row of it - because it IS the one shared
list document, not a different one.

Thanks to xet7 !
2026-09-10 18:43:08 +03:00
Lauri Ojansivu 691b096faf Close #4912: prove editing a card already reaches the global webhook.
The request asked for an act-editCard action on the global webhook so card
edits could be tracked. That already happens: server/models/cards.js logs an
Activities entry for title (a-changedTitle, #3619), description
(a-changedDescription, #5482) and due/start/end/received date changes, and
server/models/activities.js's Activities.after.insert hook turns each into
act-${activityType} and dispatches it to any enabled integration on the
card's board OR the global webhook id, filtered by
activities: { $in: [description, 'all'] }. Added a source-pattern regression
test pinning this path so it cannot silently regress.

Thanks to Rishats and xet7 !

Fixes #4912,
2026-09-10 18:42:37 +03:00
Lauri Ojansivu 4fe75d8c4f Update changelog. 2026-09-10 18:40:52 +03:00
Lauri Ojansivu b2ca9962ba Show success/failure feedback in Admin Panel's "Invite People" form.
The Admin Panel -> Accounts -> "Invite People" form called the
sendInvitation Meteor method with a callback that took no parameters at
all, ignoring both the error and the result (a commented-out "TODO -
show more info to user" sat next to it). So an admin using that form
got no feedback whatsoever when a mail-send failure happened (e.g. the
server's mail transport is not configured, which is what
sendInvitationEmail's Meteor.Error('email-fail', ...) reports) -- the
Send button just stopped spinning either way.

The member "Invite People" popup (userHeader.js) already surfaces this
via a red/green #invite-people-infos message, so settingBody.js now
does the same: read the callback's error argument and write the same
success/error message into a matching #invite-people-infos element,
added to settingBody.jade.

Thanks to Rayene123 and xet7 !

Fixes #5707,
2026-09-10 18:40:21 +03:00
Lauri Ojansivu d85631dae0 Update changelog. 2026-09-10 18:30:18 +03:00
Lauri Ojansivu c269922f4d Update changelog. 2026-09-10 18:30:03 +03:00
Lauri Ojansivu b33e2e1beb Translate the Dashboard's "none" group label; fix an invisible chart canvas
The Dashboard view's By Assignee/By Label bars grouped a card with no
assignee or label under the literal English word "none" - untranslated in
every language, on the live chart, the data table, and the PDF/Excel
export alike (models/lib/chartCalculations.js's computeDashboardGroups
hardcoded {key: 'none', label: 'none'}). Two sentinel keys
(NO_ASSIGNEE_GROUP/NO_LABEL_GROUP) plus a shared translateGroupLabel()
replace it with a real "No assignee"/"No label", translated into all 245
locales directly (not left as English placeholders), everywhere that group
label is rendered: server/lib/boardChartData.js (the server chart-data
loader both the live view and the exporters read from),
models/lib/chartExportRows.js (the shared PDF/Excel/data-table shape), and
client/components/boards/charts/boardCharts.js (the live Chart.js bars).

Also fixes a board report chart (reported: Burndown) rendering its export
buttons and table but no visible chart: the `<canvas>` boardCharts.js draws
into only exists once isLoading/hasNoData flip Blaze's jade conditional to
its "else" branch - a sibling reactive change driven by the SAME chartData
update the chart-building autorun also depends on, with no guaranteed
ordering between the two Tracker computations. The very first successful
data load could run the chart-building body before Blaze patched the DOM;
templateInstance.find() silently returned null, no chart was ever built,
and nothing triggered a retry. The canvas lookup is now deferred with
Tracker.afterFlush so it always runs after the DOM has actually been
patched.

Also removes three dead <link> tags in gantt.jade pointing at
gantt.css/ganttCard.css/boardCharts.css's raw source path - all three are
already loaded through the normal bundler import (client/features/gantt.js,
client/features/boards.js), and the runtime <link> to the unserved source
path 404'd as text/html, pure console noise on every Gantt page load.

Thanks to xet7 !
2026-09-10 18:29:40 +03:00
Lauri Ojansivu 780f0b9115 Fix Labels popup staying open and applying to the wrong card.
The Labels popup (client/lib/popup.js's global Popup singleton) was never
closed when a card's details view was closed or swapped for another card -
Blaze just destroys the cardDetails template instance, and nothing called
Popup.close()/back() in response. So the popup stayed visible after leaving
card A, and opening Labels again on card B pushed a new stack entry on top
of the stale one instead of replacing it, leaving the old entry (still bound
to card A's data) rendered alongside the new one and able to keep toggling
labels on the wrong card.

Popup.open() now resets its stack when a fresh popup (not a sub-popup opened
from within the popup that is already showing) is opened while a previous
popup is still open. Template.cardDetails remembers which card it was
opened for and, on destroy, closes Popup if it is still showing that same
card's data at the base of its stack - so closing or switching a card
dismisses its own popup without touching an unrelated one.

Thanks to rmb82 and xet7 !

Fixes #6686,
2026-09-10 18:29:25 +03:00
Lauri Ojansivu 688a2b3c46 Fix minicard collapse test's off-by-scope index and a stale offset.
The collapsed-class assertion used jade.indexOf(')\n') with no start
offset, so it matched template(name="minicard")'s own closing paren before
.minicard( even began, slicing an empty/negative range. titleClickToEdit's
title-block boundary still referenced the pre-collapse `if showLabels`
marker instead of the new `unless minicardCollapsed` guard.

Thanks to xet7 !
2026-09-10 18:06:50 +03:00
Lauri Ojansivu c89827ac36 Update changelog. 2026-09-10 18:03:45 +03:00
Lauri Ojansivu ce1cbf6fff Move minicard title to the top; add a whole-minicard collapse caret
The title used to render after the dates/cover/upload-progress block. It
now renders first, right after the drag handle and details-menu button, so
it stays visible regardless of collapse state.

A caret at the minicard's top-left corner - the same caret-down/caret-right
convention already used for list, swimlane and per-checklist folding, with
the same accessibility attributes (role="button", tabindex, aria-expanded)
as the per-checklist caret on the minicard itself - collapses everything
except the caret and title: dates, cover, upload progress, labels, custom
fields, assignees/members, checklists, badges, description, list name and
parent-task prefix/subtext. The details-menu button and the optional drag
handle render before the caret/collapse guard, so they stay reachable
either way.

State persists the same way list collapse already does:
Utils.getCardCollapseState/setCardCollapseState (client/lib/utils.js) check
a Session cache first, then profile.collapsedCards on the user document
(models/users.js, server method in server/models/users.js) - deliberately
with no anonymous/cookie fallback, since a public board can have far more
cards than lists and a per-card cookie entry per anonymous visitor would
grow without bound; an anonymous visitor's fold still works for the
session, it just does not survive a reload.

Thanks to xet7 !
2026-09-10 18:02:10 +03:00
Lauri Ojansivu d28454dd89 Update changelog. 2026-09-10 17:55:12 +03:00
Lauri Ojansivu 17aa92e90a Show all four card dates on Calendar/Frappe/DHTMLX Gantt; add drag editing
The Calendar view drew a Start/End interval bar and a separate Due marker,
but Received never got a marker at all, and a card whose Start fell
outside the visible window got no End marker either - so a user could not
see all four of WeKan's card dates (Received, Start, Due, End) on the
Calendar. cardsReceivedInBetween/cardsEndInBetween (mirroring the existing
cardsDueInBetween) give Received and End their own labeled events.

Frappe Gantt and DHTMLX Gantt each only ever drew a single bar per card
(Start-or-Received to Due-or-End), silently dropping whichever date lost
that fallback. Both now track which underlying field each bar edge
actually represents and show all four dates - Frappe in its click popup,
DHTMLX in its hover tooltip - so Received/End stay visible even when the
bar itself only spans Start/Due.

Compared against Kanboard's Gantt (kanboard/plugin-gantt, MIT) for feature
parity: both WeKan Gantt alternatives now support drag-to-move and
drag-to-resize, persisted back to the correct field (card.setStart/setDue/
setReceived/setEnd - the same calls the Calendar's own drag handlers
already use), gated on the same board-write capability as the rest of
WeKan rather than offered to users the server would refuse. Kanboard has no
dependency arrows, view-mode switching or export; nothing to match there.

Thanks to xet7 !
2026-09-10 17:54:50 +03:00
Lauri Ojansivu ac8f7e6140 Update changelog. 2026-09-10 17:44:45 +03:00
Lauri Ojansivu e5e4c97154 Give Frappe Gantt its own Board View page; add DHTMLX Gantt
Frappe Gantt was embedded below WeKan's own Gantt view on the same page.
It is now its own separate Board View menu entry and page, matching how
every other view (Swimlanes, List, Calendar, Statistics, ...) works: pick
it from the Board View menu, see only that view.

Adds a third Gantt option the same way: DHTMLX Gantt Community Edition,
genuinely MIT-licensed as of v10 (verified against the LICENSE.md text
inside the published package, not just the npm license field - the
project's own issue #2870 rejected an earlier DHTMLX Gantt proposal in
2020 for being GPL, so that distinction matters here). Zero runtime
dependencies, lazy-loaded the same way as Frappe Gantt. Unlike Frappe
Gantt's CSS, dhtmlx-gantt's package.json has no "exports" map at all, so
its CSS resolves through plain subpath resolution with no vendoring
needed. It is a page-wide singleton (`gantt`, not a class instantiated per
container), so it is torn down with destructor() on every re-render and
template destroy rather than merely cleared.

Both alternatives draw the same start/due/end task set as WeKan's own
Gantt view and export through the existing 'gantt' chart export route.

A separator now also sits between Statistics and the Gantt group in the
Board View menu, matching the existing grouping convention.

Thanks to xet7 !
2026-09-10 17:43:30 +03:00
Lauri Ojansivu fb895847b8 Fix PDF search indexing: wrong object destroyed, missing font/cmap assets
Every PDF upload logged "Document search indexing failed: TypeError:
textDocument.destroy is not a function" and left that PDF's contents
unsearchable. pdfjs-dist's getDocument() returns a PDFDocumentLoadingTask;
destroy() lives THERE. Its .promise resolves to a PDFDocumentProxy, which
has no destroy() of its own - calling it on that object throws. The loading
task is now kept and destroyed instead.

Also silences "Ensure that the standardFontDataUrl API parameter is
provided" on every PDF: pdfjs-dist ships its own standard-font metrics and
CJK character maps as plain files in the installed package: point
standardFontDataUrl/cMapUrl at them via the same runtimeResolve trick
already used for the worker file, instead of falling back to an
approximation on every single PDF indexed.

Verified end-to-end against a real uploaded PDF, not just source patterns.

Thanks to xet7 !
2026-09-10 17:28:45 +03:00
Lauri Ojansivu 0782d8c666 Fix build: frappe-gantt's CSS has no importable subpath export
meteor build (and the dev server) failed with "Package subpath
'./dist/frappe-gantt.css' is not defined by exports" - frappe-gantt's
package.json only exposes a "style" CONDITION on its "." export, not a
"./dist/frappe-gantt.css" subpath, so rspack's Node exports-map enforcement
rejected the dynamic import() outright, on every build.

Its CSS is vendored verbatim into frappeGanttLib.css instead (~7 KB,
unminified structure kept for a readable diff on a later upgrade) and
loaded with a plain static import, the same way gantt.css/ganttCard.css
already are for the view above it - only the JavaScript itself still uses a
dynamic import(), which is the part actually worth lazy-loading.

Two repo-wide CSS policy tests (WeKan's own font-scale variable, and
left/right -> logical-property conversion for RTL) scan every client
stylesheet and do not have a precedent for a vendored file that is shipped
byte-for-byte on purpose; both gained a narrow, explicit exclusion for
files whose own header says "Vendored verbatim from", checked against that
header so the exclusion cannot silently drift from what it claims to cover.

Thanks to xet7 !
2026-09-10 17:20:08 +03:00
Lauri Ojansivu cc14a14135 Update changelog. 2026-09-10 17:10:34 +03:00
Lauri Ojansivu 5d5317d968 Add Frappe Gantt below the existing Gantt view, draw report charts with Chart.js
Two full-featured, permissively-licensed charting libraries replace the
plain CSS bars used so far, chosen for a copyfree license and a minimal,
auditable dependency tree over feature richness: Frappe Gantt (MIT, zero
runtime dependencies, ~15 KB gzipped) and Chart.js (MIT, one dependency -
@kurkle/color, also MIT). Both are loaded with a dynamic import() so their
code only reaches the browser when the relevant view is actually opened.

WeKan's own hand-rolled Gantt view (the week-grid table) is kept exactly as
it is; Frappe Gantt is added below it in the same board view
(client/components/gantt/frappeGantt.js/.jade/.css), drawing the same
start/due/end task set from the board's cards, opening a card on click, and
exporting to PDF/Excel through the existing 'gantt' chart export route
(models/exportCharts.js) rather than a second pipeline for identical data.

The 10 board report chart views (client/components/boards/charts/) draw a
Chart.js bar chart instead of a stack of CSS-width divs, reusing the same
computeBarRows data normalization and the same per-chartKey export route
unchanged - only the rendering changed.

Thanks to xet7 !
2026-09-10 17:10:08 +03:00
Lauri Ojansivu a72c0e98b6 Update changelog. 2026-09-10 16:59:54 +03:00
Lauri Ojansivu 373980ac8a Restore the full-featured DOCX/XLSX/PPTX viewer and native PDF preview
The minimal server-rendered GIF-slideshow document preview (added this week
to cut dependency weight) kept failing with a bare 415 - its own
rasterization dependency chain (pdf-to-img -> pdfjs-dist's optional
@napi-rs/canvas) needed three separate fixes in a single day for a missing
package, a worker path resolved into the wrong bundle directory, and a stale
stored filename, and still left a text-only fallback as the best case for a
PDF.

Restore the previous full-featured viewer instead: office-open-xml-viewer
(MIT, canvas-based, zero runtime dependencies) renders DOCX/XLSX/PPTX
client-side, and PDF goes back to the browser's own native <embed> viewer -
simpler, zero extra dependencies, and gets the browser's own zoom/search/
print for free.

The server-side full-text search this week's change introduced is kept:
server/lib/documentGif.js now does nothing but extract plain text for the
search index (indexDocumentText, triggered in the background from
Attachments.onAfterUpload) - no rendering, no HTML, no page images - so
pdf-to-img and @napi-rs/canvas are dropped entirely (nothing rasterizes a
PDF page server-side any more) while pdfjs-dist stays, now as a direct
dependency, for its text-only extraction. Searching attachment contents from
the card search box keeps working exactly as before.

Thanks to xet7 !
2026-09-10 16:59:42 +03:00
Lauri Ojansivu 64adab5aa6 Fix #6685: document preview 415 from a stale stored name on disk
After the pdf.worker.mjs fix, opening the PDF preview still failed with a
415, now logging "Attachment image stream is unavailable" from
boundedStreamBuffer: getFileStrategy(attachment, 'original').getReadStream()
returned nothing. The regular attachment download route repairs a stored
name/extension that has drifted from what is actually on disk
(normalizeStoredNameOnRead, fs-path-heal) before it reads the file;
authorizedDocument (shared by all three /document-preview/* routes) never
did, so getReadStream() could resolve the wrong path for an attachment whose
name needed that repair, even though the very same attachment downloads and
previews fine as a plain image.

Thanks to rmb82 and xet7 !
2026-09-10 16:34:10 +03:00
Lauri Ojansivu 3f1f15e449 Update changelog. 2026-09-10 16:29:44 +03:00
Lauri Ojansivu eb98abe4b2 Fix #6685: PDF preview 415 from pdfjs guessing the worker's bundled path
Opening the PDF slideshow viewer on an attached PDF still failed with a 415
after the previous #6685 fix, now with the real error visible:
"Setting up fake worker failed: Cannot find module
'.../_build/main-dev/pdf.worker.mjs'". pdfjs-dist's Node fake-worker
fallback locates pdf.worker.mjs relative to import.meta.url of the module
that imported it; under the bundled server (_build/main-dev,
_build/main-prod) that URL points into the bundle output, not into
node_modules, so the fallback looked for the worker beside the bundled
server.cjs and never found it - every PDF preview failed, image and text
alike, not only the rasterized-image path the earlier fix addressed.

Point GlobalWorkerOptions.workerSrc at the real on-disk file via Node's own
module resolution (the same runtimeRequire trick already used for fflate)
so pdfjs never falls back to guessing. pdf-to-img imports the same single
pdfjs-dist instance, so this also fixes its internal rasterization.

Thanks to rmb82 and xet7 !
2026-09-10 16:28:51 +03:00
Lauri Ojansivu 96e72cf294 Update changelog. 2026-09-10 16:22:41 +03:00
Lauri Ojansivu 9b9c2fe6e4 Fix PDF/DOCX/XLSX/PPTX preview 415 when the optional canvas dep is missing
pdf-to-img rasterizes PDF pages through pdfjs-dist's optionalDependency
@napi-rs/canvas. A Docker/Snap build that skips optional dependencies, or
lacks a prebuilt binary for its target architecture, then throws on the
very first PDF preview - "Cannot load @napi-rs/canvas", "Cannot polyfill
DOMMatrix" - which the generic catch in server/routes/universalFileServer.js
turned into a bare 415 with the real error never logged.

@napi-rs/canvas is now a direct dependency so it installs the same way
every other required package does. Rasterization is also no longer
all-or-nothing: pdfjs-dist's text extraction does not need canvas, so when
rasterizing still fails for any reason the PDF preview now degrades to
text-only pages (dropped images, kept text) instead of failing outright -
the same graceful degradation the minimal viewer already applies to an
unreadable embedded image in a DOCX/PPTX/XLSX. The three document-preview
routes now log the caught error before returning 415.

Thanks to rmb82 and xet7 !

Fixes #6685,
2026-09-10 16:22:02 +03:00
Lauri Ojansivu 1e18c824d5 Give the HttpOnly login cookie a fallback expiry
The native useHttpOnlyCookies resume flow only attaches Expires/Max-Age to
meteor_login_token when it can match the freshly issued token back to a
stored resume token in the database at the exact moment the cookie is
written. When that lookup misses, the cookie is written with no expiry at
all, so the browser treats it as a plain session cookie and drops it the
moment the browser closes - silently downgrading the configured 90-day
login into a same-session-only one. http.ServerResponse.prototype.setHeader
is now patched to guarantee a fallback expiry, decided by a pure, tested
helper (server/lib/loginCookieExpiry.js), whenever a Set-Cookie header for
that cookie carries neither directive.

This hardens the failure mode that best matches #6684, but has not been
confirmed as its root cause from a live browser-restart reproduction; the
issue stays open pending that.

Thanks to markusst1982 and xet7 !
2026-09-10 16:21:52 +03:00
Lauri Ojansivu 3e5638b1fc Prepare v11.68 release 2026-09-10 15:06:36 +03:00
Lauri Ojansivu 0c77553b89 Updated translations. 2026-09-10 15:06:08 +03:00
Lauri Ojansivu 88755f0c6d CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-10 15:04:05 +03:00
Lauri Ojansivu f36350c955 Update changelog.
Add Upcoming entry for the board report charts and Gantt/chart export
feature, and link the two entries in v11.67 that were missing their commit
links.
2026-09-10 15:04:05 +03:00
Lauri Ojansivu 3abc1078c2 Implement the 10 board report charts and Gantt/chart PDF+Excel export.
The Board View menu's Dashboard, Burndown, Burnup, Cumulative Flow, Control
Chart, Lead/Cycle Time, Flow Efficiency, Throughput Histogram and WIP Run
entries opened a plain "not implemented yet" page. Each now computes and
renders its chart from this board's own Cards/Lists/Activities, per
docs/Features/Reports/charts.tsv's calculation descriptions - plain HTML/CSS
bars and a data table, no new charting dependency.

Every chart page, and the Gantt view, gets "Export to PDF" / "Export to
Excel" buttons that reuse the existing card/board export renderers
(pdfDocument's line/bar builder, createWorkbook's Excel styling) through the
same public-board / authToken / logged-in-user auth gate every other export
route already uses.

Completion date is card.endAt || card.archivedAt (WeKan has no dedicated
"Done" list flag); WIP Run's limit line only draws when a list's own WIP
limit is enabled (no invented board-level schema); Flow Efficiency's
"active" time is card.spentTime (WeKan does not track per-list queue time).
Each deviation from charts.tsv is documented where the calculation is.

models/lib/chartCalculations.js (20 tests), models/lib/chartExportRows.js
(8 tests) and the export routes' auth shape (10 tests) are covered by
tests/chartCalculations.test.cjs, tests/chartExportRows.test.cjs and
tests/chartExportRoutesAuth.test.cjs; tests/boardViewMenu.test.cjs is
updated for the now-real views. Not verified here: actual Blaze rendering
and generated PDF/XLSX bytes (no browser/Meteor runtime in this
environment) - matched syntactically against statsView/timeView and the
existing exporters.
2026-09-10 15:04:05 +03:00
github-actions[bot] 14b2306f57 Bump versions for v11.67 2026-09-10 00:16:23 +00:00
Lauri Ojansivu 68fee85db7 Prepare v11.67 release 2026-09-10 03:15:20 +03:00
Lauri Ojansivu f383fe9b3a Fix board export to .zip (with attachments) answering a bare 500 error.
models/server/ExporterZip.js still called archiver the v7 way -
require('archiver')('zip', {...}). archiver@8 is ESM-only and exports
classes with no callable default, so that call threw synchronously before
exportZip's route wrote any response header, and safeRoute answered a bare
500 with no detail - every "export board -> .zip" request, for every
board. server/methods/backup.js hit the identical break earlier and
already fixed it with `new ZipArchive({...})`; this call site was missed.
Fixed the same way, with a regression test that also scans the tree for
the same dead API shape.

Thanks to the reporter and xet7 !
2026-09-10 03:13:37 +03:00
Lauri Ojansivu f3c39f3b2c Close #6681: OIDC redirect-style login loop, already fixed.
The reporter's DEBUG=true server log (getToken/getUserInfo repeating six
times in under twenty seconds, a fresh access token each time) matches the
exact race commit 89682c251 already fixed: oauth2-login-style redirect with
oidc-redirection-enabled true re-firing the auto-redirect on the identity
provider's bounce-back render before the prior login had finished. That fix
landed before v11.62, several releases back; the reporter's build predates
it. tests/oidcAutoRedirectLoop.test.cjs (6 checks) still passes against
current source. No application code changed; asked the reporter to upgrade.

Thanks to Alishara and xet7 !

Fixes #6681,
2026-09-10 03:13:37 +03:00
github-actions[bot] ad0fa1c2f1 Bump versions for v11.66 2026-09-09 19:19:04 +00:00
Lauri Ojansivu 629b1705d2 Prepare v11.66 release 2026-09-09 22:17:48 +03:00
Lauri Ojansivu a25c3d9fc1 Update changelog.
Add Upcoming section summarizing the newest node-patches,
mongo-tools-patches and mongosh-patches build improvements not yet
reflected in the WeKan changelog.
2026-09-09 22:12:11 +03:00
github-actions[bot] d3cc6000ab Bump versions for v11.65 2026-09-09 16:42:57 +00:00
Lauri Ojansivu e919103254 Prepare v11.65 release 2026-09-09 19:40:54 +03:00
Lauri Ojansivu 2051da8a31 Update changelog. 2026-09-09 19:31:37 +03:00
Lauri Ojansivu 5f197f4bde Fix #3823 e2e test for the Show on Minicard -> Board Settings/Card move.
The test still clicked the minicard's own "Show on Minicard" menu entry
(.js-show-on-minicard), which no longer exists: that setting moved to
Board Settings / Card, reached from the board's cog menu, as part of
this session's #6680 follow-up. Updated the test to open it from there
instead - the underlying checkbox
(.js-field-has-creator-on-minicard) and its behavior are unchanged.
2026-09-09 19:29:18 +03:00
Lauri Ojansivu 5395361a3c Updated translations. 2026-09-09 18:18:45 +03:00
Lauri Ojansivu 8f65cc0def CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-09 18:15:10 +03:00
Lauri Ojansivu 124aaf5f77 Update changelog. 2026-09-09 18:15:10 +03:00
Lauri Ojansivu 5adc030bde AppImage: relocate its own mount from /tmp to WRITABLE_PATH/app.
Reported: checkmk warned "/tmp/.mount_wekan.OhaGOG ... 100% used"
because the AppImage runtime's own read-only squashfs mount landed on a
small /tmp (a squashfs mount always reports 100% used regardless of
size, so this was really "/tmp is too small for the AppImage", not a
leak).

The AppImage runtime mounts itself under $TMPDIR/.mount_<name>.<random>
(defaulting to /tmp) before AppRun ever runs, so the very first launch's
mount cannot be redirected from inside AppRun. AppRun now re-execs
itself once per launch with TMPDIR set to WRITABLE_PATH/app when the
caller has not already chosen a TMPDIR, so every launch from then on
mounts there instead - and, on that same first launch, sweeps out any of
WeKan's own orphaned .mount_*ekan* directories left in /tmp by an
earlier, uncleanly-killed run (a live one, matched against /proc/mounts,
is never touched).

AppImage-only: no other WeKan platform (Docker, snap, .deb, the bundle
zip) FUSE-mounts itself the way an AppImage does, so none of them are
touched. tests/appImageRuntime.test.cjs pins the relocation, the
once-per-launch/explicit-TMPDIR guards, and that only orphaned mounts
are removed.
2026-09-09 18:15:10 +03:00
Lauri Ojansivu f51e95aac7 Update changelog. 2026-09-09 18:15:10 +03:00
Lauri Ojansivu e6a894f5fc Give the 4 Attachments/Avatars advisories their own Hall of Fame names.
The upload path-traversal guard was logging under the pre-existing
PathBleed key (a different, already-published advisory,
GHSA-4mxf-m8pq-xc9p about avatar versions.path and board export) - it
now has its own UploadPathBleed key, so the two incidents are not
conflated on the public Hall of Fame page or in Admin Panel / Problems.
The two High advisories (missing Avatars.protected, unauthenticated
serveLegacyAvatar) now also log a blocked attempt, under new
authz.avatar-protected/PortraitBleed and
authz.legacy-avatar/RelicAvatarBleed keys, matching the site entries
added at .tools/wekan.fi.

tests/securityRegressionCoverage.test.cjs's inventory and
tests/attachmentAvatarSecurityAdvisories.test.cjs are updated so all four
names (WipeBleed, UploadPathBleed, PortraitBleed, RelicAvatarBleed) are
recognized as GUARDED, matching the published Hall of Fame count.
2026-09-09 18:15:10 +03:00
Lauri Ojansivu 1d7e421549 Update changelog. 2026-09-09 18:15:10 +03:00
Lauri Ojansivu 9947e0138a Fix 4 security advisories in Attachments/Avatars (ostrio:files 3.0.1).
CRITICAL - Unauthenticated Arbitrary File Write via Path Traversal in
Attachment Upload namingFunction: Attachments overrode ostrio:files'
sanitize() to an identity function and used the client-supplied fileId
verbatim as the on-disk file name, so an anonymous upload with
fileId: "../../../../tmp/pwn" could write attacker-controlled content
anywhere the WeKan process can write. sanitize() is restored to the same
whitelist models/avatars.js already used for the same tokens, and
namingFunction now validates the (sanitized) fileId against the ObjectId
shape WeKan itself generates, regenerating a fresh one otherwise.

CRITICAL - Unauthenticated DDP Methods _FilesCollectionRemove_attachments/
_FilesCollectionRemove_avatars Allow Instance-Wide Deletion: ostrio:files
registers its own remove method, gated only by allowClientCode and never
routed through Attachments.allow/Avatars.allow (those only gate the
ordinary Mongo .remove() call). Attachments had no onBeforeRemove at all
and Avatars' unconditionally returned true, so any anonymous DDP caller
could pass selector {} and wipe every attachment or avatar on the
instance. Both now require this.userId and check every matched file:
attachments need the caller's board-write access, avatars need ownership
or site-admin status.

High - Avatars Collection Lacks `protected` Callback: unlike Attachments,
Avatars never set `protected`, so ostrio:files' own library-native
download route (its _checkAccess defaults to allowing everything when
`protected` is unset) served any avatar to anyone, bypassing
isAuthorizedForAvatar entirely. Avatars.protected now mirrors
Attachments.protected: any authenticated caller, or an anonymous one only
when the avatar's owner is on a public board.

High - serveLegacyAvatar Serves Legacy CollectionFS Avatars Without Any
Authentication: both call sites in server/routes/avatarServer.js streamed
a legacy avatar to any caller who knew its old filerecord id, one of them
(/cfs/files/avatars) with no check at all. Both now require an
authenticated caller (isLegacyAvatarAuthorized) - legacy records carry no
owner/board link that can be safely checked for the public-board
exemption current avatars get, so this is deliberately narrower rather
than reusing that exemption on an unverifiable claim.

Both CRITICAL fixes log a blocked attempt through the shared security log
(new authz.file-remove/WipeBleed catalog key, and the existing
authz.file-path/PathBleed key), so Admin Panel / Problems shows an
attempt was made. tests/attachmentAvatarSecurityAdvisories.test.cjs pins
all four fixes and the negative cases (no dangling anonymous bypass, no
regression to the legitimate admin avatar-delete and public-board
redirect flows).
2026-09-09 18:15:10 +03:00
github-actions[bot] 88732d3e90 Bump versions for v11.64 2026-09-09 11:22:20 +00:00
Lauri Ojansivu 9b690363e0 Prepare v11.64 release 2026-09-09 14:21:14 +03:00
Lauri Ojansivu 3fdc849da4 Update changelog. 2026-09-09 13:57:50 +03:00
Lauri Ojansivu e6f81c0c97 Update changelog. 2026-09-09 12:09:05 +03:00
Lauri Ojansivu 4374502a49 Hide List Actions / Set width and Swimlane Actions / Set Swimlane height.
Both are still reachable by dragging the resize handle (unless Board
Settings / List or Board Settings / Swimlane has locked that), and the
board-wide fixed-width value now lives in Board Settings / List - a menu
entry for the same thing was a second place to look for it. The
underlying popups (setListWidthPopup, setSwimlaneHeightPopup) are
untouched, only the menu entries that opened them are removed.

Removing "Set width" left its own group empty, so the group (and its
enclosing hr) is removed entirely. Removing "Set Swimlane height" left
"Select color" as the only row of its group, so that group's hr moves
inside the same isBoardAdmin check as the color entry itself, rather than
leaving a dangling hr (or an empty list) for a non-admin.
2026-09-09 12:07:18 +03:00
Lauri Ojansivu c3e0dfb0e4 Update changelog. 2026-09-09 12:00:53 +03:00
Lauri Ojansivu 250adfe9ac Edit Custom Fields popup: no rule above Add when there are no fields yet.
The hr between the field list and "Add custom field" was unconditional,
so with no custom field on the board yet it drew a rule with nothing
above it to separate. It is now conditional on board.customFields.length.
2026-09-09 11:59:15 +03:00
Lauri Ojansivu 4e228521fd Update changelog. 2026-09-09 11:56:23 +03:00
Lauri Ojansivu 13ca5e08ad Board Settings / Card: Show on Minicard column reads left of Show on Card.
CSS order on the grid items, not a markup change: column 1 (card) and
column 2 (minicard) keep their original DOM order, so the show-card-only/
show-minicard-only nth-child hiding rules still target the right element
regardless of side. Only the visual position of the two swaps; Description
(column 3) gets an explicit order too, so it is not pulled in front by
the default order:0 an unordered item would otherwise share.
2026-09-09 11:53:46 +03:00
Lauri Ojansivu fa73220366 Update changelog. 2026-09-09 11:47:18 +03:00
Lauri Ojansivu a8c8ed63aa Board Settings: remove the duplicate hr above Move Board to Archive.
The Swimlane/List/Card group's own closing hr and the Archive Board
group's opening hr sat back to back, drawing two rules where one was
enough.
2026-09-09 11:45:57 +03:00
Lauri Ojansivu ccae1b6920 Update changelog. 2026-09-09 11:36:41 +03:00
Lauri Ojansivu 9138f6f860 Board Settings / Card: restore the Show on Card/Minicard/Description headings.
The column headings above the settings table (commit 02025aa6c) were
removed because the popup used to flow its rows into several side-by-side
columns whenever only Card or only Minicard was shown, so the heading sat
above the first of those columns and read as if it named that one alone.

Board Settings / Card always shows both columns in a single list of rows
now (no side is passed, so that multi-column masonry layout never
applies), so the ambiguity that got the heading removed is gone. It is
back as an ordinary .card-settings-row - not the old separate
.card-settings-grid/sticky-header markup - so the same CSS that hides a
column for the still-supported side="card"/"minicard" case hides the
matching heading with it, and personalOnly (what a non-admin gets) hides
the whole heading along with every other non-personal row. All three
labels reuse existing, already-translated keys (show-on-card,
show-on-minicard, description).
2026-09-09 11:33:53 +03:00
Lauri Ojansivu 46666fb3fc Update changelog. 2026-09-09 03:35:07 +03:00
Lauri Ojansivu 2606ab56ba Move swimlane/list resize settings and card settings into Board Settings.
#6680 follow-up. Three reorganizations of where board settings live,
grouped under Board Settings (the board's cog menu), with an <hr> above
and below the new group of three:

- The list-width and swimlane-height resize-lock toggles and the
  board-wide "same width for all lists" toggle move out of the header
  and into Board Settings / Swimlane and Board Settings / List.

- Minicard and Card settings (the shared board-wide settings table) move
  back into Board Settings / Card. They previously lived split across
  the card's own menu ("Show on Card") and the minicard's own menu
  ("Show on Minicard"); both entries, their popups, and the
  cardMenuSource module that only existed to tell those two menus apart
  are removed. A non-admin still reaches the one PERSONAL row in that
  table ("Labels text") through the same entry, via personalOnly.

Swimlane and List stay board-admin only (the resize locks already were);
Card is open to any board member, matching who could reach it before.
All three reuse existing translations ('swimlane', 'list',
'card'/'card-settings') via Popup.open's titleKey rather than adding new
*Popup-title keys.

tests/boardSettingsSwimlaneListCard.test.cjs pins the new layout;
tests/listSwimlaneResizeLock.test.cjs, tests/headerIconsCollapse.test.cjs
and tests/popupTitles.test.cjs are updated for what moved.
2026-09-09 03:32:00 +03:00
Lauri Ojansivu 0281b4d1b2 Update changelog. 2026-09-09 03:07:29 +03:00
Lauri Ojansivu afb6bc5cf1 Fix collapsed list title x-position not matching the caret above it.
A generic .list-header .list-header-name rule sets min-width: 56px for
ordinary (non-collapsed) list headings. min-width is a separate property
from width, so it survives the cascade even where a more specific
collapsed-list rule wins on width, clamping the rotated title's box to
56px regardless of the 30px collapsed column - offsetting it to the right
of the caret above it. Override min-width back to 0 in every collapsed-
title h2 rule (the plain/mobile-view rule, the desktop :not(.mobile-view)
rule, and its three @media min-width duplicates) so width: 100% of the
narrow column actually applies.

Verified with a Playwright measurement of the caret's and title's
horizontal centers matching after the fix.
2026-09-09 03:05:57 +03:00
Lauri Ojansivu d985994bd9 Fix regressions from the header-icons-collapse toggle (d1b01924e).
Two real breakages, both caught by the full node-suite run rather than by
the four tests added alongside the feature itself:

1. The collapsed state was appended into #header-quick-access's own
   `class="{{themeColorClass}}"` binding, which broke
   tests/globalThemeColor.test.cjs's exact count of elements using that
   binding unmodified. Moved to a separate `data-header-icons-collapsed`
   attribute instead, and updated header.css's selector to match on it.

2. Wrapping +boardHeaderButtons/+allBoardsHeaderButtons/+boardViewMenu/
   +allBoardsViewMenu/+adminPanelTabs in a span.js-header-collapsible-icon
   broke four tests (allBoardsPage, boardHeaderOneLine, headerBars x2) whose
   regexes expected each inclusion to sit directly on the line after its
   `if isBoardPage`/`if isAllBoardsPage`/`if isAdminPanel` guard. Updated
   each regex to expect the new wrapper span in between.

tests/headerIconsCollapse.test.cjs itself is updated for the data-attribute
shape. Full node-suite run is back to the two pre-existing, unrelated
failures (buildScriptParity, gitMirrorUpdateScripts - missing build
scripts in this sandbox).

Thanks to xet7.
2026-09-09 02:54:06 +03:00
Lauri Ojansivu fb52e9be21 Translate the header-icons-collapse tooltip into all locales.
toggle-header-icons-collapsed was added to en.i18n.json only in commit
d1b01924e; translate it into all 232 other locale files, per this repo's
translation policy (CLAUDE.md - every language gets translated, not just an
English placeholder). A handful of lower-resource languages (Klingon,
Wolof, Cherokee, and similar obscure/under-resourced ones) were translated
with lower confidence from cognates and kanban-adjacent vocabulary rather
than fluent native phrasing, and will be replaced automatically by a real
Transifex human translation when one arrives.

node releases/translations/fill-translations.mjs --missing now reports 0.

Thanks to xet7.
2026-09-09 02:53:52 +03:00
Lauri Ojansivu ac8c2d1096 Update changelog.
Thanks to xet7.
2026-09-09 02:35:56 +03:00
Lauri Ojansivu d1b01924e1 Add a header-icons collapse toggle beside the board title (#6680 follow-up).
A single button, right after the board title (inside the same .home-icon
wrapper), that hides every icon from the mobile/desktop toggle through the
notification bell: mobile/desktop mode, drag-handles toggle, the three
board-wide resize-lock icons, the starred-boards group, create-board, the
board/all-boards header buttons, the view menu, the Admin Panel tabs, and
notifications.

Purely a per-viewer display preference, not persisted anywhere - a plain
Session var (wekan-header-icons-collapsed), the same shape as mobileMode()
right beside it in header.js, not a board setting like the resize locks.

Every icon in that range gets a shared .js-header-collapsible-icon marker
class; the four `+templateName` inclusions and +notifications cannot carry
a class of their own, so each is wrapped in a `span.js-header-collapsible-
icon` that stays `display: contents` outside the collapsed state, so
introducing the wrapper does not change how those icons behave as flex
items of #header-quick-access when nothing is collapsed.
`#header-quick-access.header-icons-collapsed .js-header-collapsible-icon`
is the one CSS rule that actually hides them.

tests/headerIconsCollapse.test.cjs pins the button's position, the
Session-var (not board-setting) shape, that every icon in the range is
marked and nothing outside it is, and both CSS rules.

Thanks to xet7.
2026-09-09 02:35:14 +03:00
Lauri Ojansivu c481ce1737 Update changelog.
Thanks to xet7.
2026-09-09 02:26:35 +03:00
Lauri Ojansivu c543a39095 Keep a collapsed list's title near the caret, only centered horizontally.
The previous fix (385f36e91) over-corrected: making .list-rotated grow to
fill the whole (often 540px) collapsed column and centering within that
full height moved the title far from the collapse-toggle/drag-handle at the
top (.tools/collapse2.png) - "centered" meant horizontally, across the 30px
column width, not vertically down the whole column.

Reverted both rule sets to exactly how they shipped (sized to their own
content, near the top) and kept only the one real fix: the desktop rule
that actually wins (.list.list-collapsed:not(.mobile-view) ...) had
`text-align: start`, leaving the vertical text flush to one edge instead of
centered across the width. Changed to `text-align: center`, matching the
plain/mobile-view rule, which already had it and was never broken.

tests/collapsedListTitleCentered.test.cjs is rewritten for this shape:
pins the text-align fix, and negatively pins that neither rule set grows
or centers across the full column height any more.

Thanks to xet7.
2026-09-09 02:25:45 +03:00
Lauri Ojansivu 1a29f3ae8d Update changelog.
Thanks to xet7.
2026-09-09 02:12:03 +03:00
Lauri Ojansivu 385f36e91a Center a collapsed list's rotated title in its column.
The title used to sit near the TOP of a tall (540px) collapsed list, with
empty space below it (.tools/collapse.png), on the desktop rule that
actually wins (.list.list-collapsed:not(.mobile-view) ...): it explicitly
pinned the title with `flex: 0 0 auto` and `align-self: flex-start` and
never grew to fill the space left after the collapse-toggle/drag-handle.
The plain (mobile-view) rule had the opposite bug - `flex: 1` fighting its
own explicit `height: auto !important`, which also kept it from growing.

Fixed both to grow (flex: 1 / flex: 1 1 auto) and center (display: flex;
align-items/justify-content: center). Centering the title text itself
inside its now-correctly-sized box needed one more fix verified with a
Playwright screenshot of a minimal reproduction: shrinking the <h2> to its
own content (so the parent's centering has something to center) rendered
NO TEXT AT ALL for a vertical writing-mode block box with width/height:
auto in a real browser. The <h2> stays 100%/100% of its parent instead and
centers its own text run with flex (display: flex; align-items/
justify-content: center on the h2 itself), which measured correctly in
both the plain and :not(.mobile-view) rule sets.

tests/collapsedListTitleCentered.test.cjs pins the fixed values in both
rule sets, comment text stripped first so an old value quoted in a
"this used to be X" explanatory comment cannot pass as evidence X is gone.

Thanks to xet7.
2026-09-09 02:11:23 +03:00
Lauri Ojansivu ad572c5b9e Update changelog.
Thanks to xet7.
2026-09-09 01:57:28 +03:00
Lauri Ojansivu bf93de325d Hide the swimlane resize handle while its board-wide lock is on.
startResize() already refused to act while
board.getSwimlaneHeightResizeLocked() was true, but the handle itself - and
its blue drag-height line on hover - stayed visible, which reads as broken
rather than locked. Hide it entirely while locked, the same way
client/components/lists/list.js already hides .js-list-resize-handle for
its own lock, wrapped in a tpl.autorun so toggling the lock updates it live.

Thanks to xet7.
2026-09-09 01:56:44 +03:00
Lauri Ojansivu 08e71a72b8 Give the "same width for all lists" toggle the check/ban icon pair too.
Same shape as the two resize locks beside it: fa-check when the board-wide
same-width mode is on, fa-ban when it is off, instead of a static fa-columns
with a separate "active" background class. Dropped the "active" class
entirely - the icon swap already says which state it is in, and that class
happened to match a stale guard (tests/boardExportScope.test.cjs) written
for a different, unrelated bug: an unconditional tick beside an
`{{#if}}active{{/if}}` class outside a `ul.checkable` list used to mean an
always-on tick that lied about the row's state. This button's tick is not
unconditional - it is the reactive fa-check/fa-ban pair - so the class was
simply redundant, not a repeat of that bug.

Thanks to xet7.
2026-09-09 01:53:45 +03:00
Lauri Ojansivu 1241c05286 Update changelog.
Thanks to xet7.
2026-09-09 01:40:58 +03:00
Lauri Ojansivu a676951983 Use the drag-handles check/ban icon pair for the resize-lock toggles.
The list-width and swimlane-height resize locks used their own fa-lock/
fa-unlock icons. Match .js-toggle-desktop-drag-handles instead: fa-check
when resizing is allowed, fa-ban when this lock has denied it - the same
allowed/denied icon language already used right beside them in the header.

Thanks to xet7.
2026-09-09 01:40:19 +03:00
Lauri Ojansivu 41ad95f2f3 Update changelog.
Thanks to xet7.
2026-09-09 01:32:10 +03:00
Lauri Ojansivu 5c48be8e67 Add board-wide list-width/swimlane-height resize locks (#6680).
Adds three independent per-board toggles in the top header, right of the
drag-handles toggle:

  - list-width resize lock: left-right arrow icon plus a lock/unlock icon
    that flips when clicked. Locked, the drag-resize handle between lists
    does nothing for anyone on the board.
  - swimlane-height resize lock: same shape, up-down arrow icon, gates the
    drag handle at the top of each swimlane.
  - "same width for all lists": the board-wide equivalent of the existing
    per-user "Set width" popup's fixed-width mode. An admin can force every
    list on the board to one shared width for every viewer, overriding each
    member's own personal choice while it is on.

All three are board settings (models/boards.js: listWidthResizeLocked,
swimlaneHeightResizeLocked, sameWidthForAllLists, sameWidthForAllListsValue),
shown only on a board page and only to board admins (client) - turning a
toggle itself on/off is admin-only on the server too
(server/permissions/boards.js's default allowIsBoardAdmin rule). Dragging
the shared same-width VALUE, though, is allowed for any board member with
write access, via a new sole-field Boards.allow rule
(canUpdateBoardSameWidthValue in server/lib/utils.js) shaped exactly like
the existing canUpdateBoardSort rule: it approves a modifier ONLY when
sameWidthForAllListsValue is the one field touched, so a lower-privilege
member can never smuggle another board field into the same update.

client/components/lists/list.js's canResizeList/effectiveListWidth/
saveListWidth and client/components/swimlanes/swimlanes.js's resize
startResize are the actual enforcement points - the lock is checked before
a drag can start, and the board-wide fixed width takes priority over each
viewer's personal fixed-width mode.

Added the 3 new tooltip strings to all 235 locale files (not just English),
per this repo's translation policy; a handful of lower-resource languages
(Klingon, Wolof, Cherokee, and similar) were translated with lower
confidence and will be replaced by a human Transifex translation
automatically when one arrives. tests/listSwimlaneResizeLock.test.cjs pins
the schema, the header wiring, the permission rule shape, and that each
resize handle actually checks its lock.

Thanks to Hallsie and xet7.

Fixes #6680,
2026-09-09 01:30:08 +03:00
Lauri Ojansivu f8332874d4 Renamed mirror scripts.
Thanks to xet7 !
2026-09-09 01:22:09 +03:00
Lauri Ojansivu c02e4e995f Update CLAUDE.md/AGENTS.md and the format test for the new Status heading.
The maintainer restructured the top of CHANGELOG.md by hand: "# Platforms"
and "# TODO Later" are no longer their own top-level headings. Both are now
<details> blocks nested inside a single "# Status" heading, which also
gained a "More status info" block linking https://wekan.fi/status/, and the
platform/install links moved into their own "Newest WeKan at these
platforms" details instead of sitting directly under the heading.

Updated CLAUDE.md's/AGENTS.md's "file's shape" spec and every other mention
of "# Platforms"/"# TODO Later" as literal headings to describe the new
nesting. tests/changelogFormat.test.cjs's structural checks all located
"# TODO Later" by exact heading text, which no longer exists; replaced with
a shared `todoAt` lookup of `<summary>TODO Later</summary>` used everywhere
those checks anchor themselves. releases/changelog-archive.mjs needed no
change: it already finds the header by "everything above the first release
heading" and the "Older releases:" bullet by content, not by position
relative to "# Platforms" specifically.

Thanks to xet7.
2026-09-09 00:44:14 +03:00
Lauri Ojansivu bed56b7859 More status info link added.
Thanks to xet7 !
2026-09-09 00:30:27 +03:00
Lauri Ojansivu 67d495aeee Changed changelog subsection name from platforms to status.
Thanks to xet7 !
2026-09-09 00:27:38 +03:00
Lauri Ojansivu 4c087d25f2 Updated details summary sections at top of changelog.
Thanks to xet7 !
2026-09-09 00:25:43 +03:00
Lauri Ojansivu 4b303fe099 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-09 00:17:38 +03:00
Lauri Ojansivu fbff370d61 Update changelog.
Thanks to xet7.
2026-09-09 00:17:38 +03:00
Lauri Ojansivu 59bed92f32 Revert "Hardcode list width to 240px and remove the width/height set-value popups"
This reverts commit 8614949580.

Restores the per-user/per-list resizable list width (drag-resize handle, the
"Set width" list-menu popup, the board-settings "Personal list width"
sidebar toggle, and the auto-width mode) and the "Set swimlane height"
popup, at the maintainer's request.

Thanks to xet7.
2026-09-09 00:17:38 +03:00
Lauri Ojansivu 7883cf2ac4 Remove the Platform/Binary/From/Version/SHA256 table from CHANGELOG.md.
The maintainer removed this table by hand from the current month's
CHANGELOG.md - it was tried right under each release's "In short" summary,
then moved to a "Binaries in these bundles" label at the end, and both times
made every release's entry mostly a giant table nobody read. Update
CLAUDE.md/AGENTS.md's CHANGELOG spec and the docs template to stop
prescribing it, and change tests/changelogFormat.test.cjs's binaries-table
test into a negative one. tests/newestBundledBinaries.test.cjs is updated to
verify the same data instead through the GitHub Release notes, which
releases/provenance-table.sh still builds fresh from
releases/record-provenance.sh's recordings on every release - that mechanism
is unchanged, only the CHANGELOG copy is removed.

Thanks to xet7.
2026-09-09 00:17:38 +03:00
github-actions[bot] da761a3eff Bump versions for v11.63 2026-09-08 20:06:00 +00:00
Lauri Ojansivu f20d935972 Prepare v11.63 release 2026-09-08 23:04:15 +03:00
Lauri Ojansivu dd41235170 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-08 23:03:22 +03:00
Lauri Ojansivu 72cf8d7c61 Update changelog.
Thanks to xet7.
2026-09-08 23:03:22 +03:00
Lauri Ojansivu 0c1b8a4ca4 Remove the Docker Hub/Quay.io registry-overview sync.
DOCKERHUB_AUTH/QUAY_AUTH are scoped for docker login/image push, and neither
registry grants a push-scoped token the rights a repository-description
write needs - v11.62's release-all.yml run already showed this step fails
with 403 even though the image itself publishes fine (the previous commit
turned that into a non-fatal warning rather than fixing the underlying
permission gap). The maintainer now updates both registries' overviews by
hand, so remove the step entirely rather than keep maintaining a permission
workaround for it. tests/dockerRegistryOverviewSync.test.cjs is removed with
it, and its curl -X PATCH/-X PUT exemption in
tests/releaseDownloads.test.cjs is reverted since no such calls remain.

This also resolves GitHub code scanning alerts #523-#525 ("Incomplete URL
substring sanitization"), which flagged the now-deleted test file's URL
substring assertions.

Thanks to xet7.
2026-09-08 23:03:22 +03:00
Lauri Ojansivu 3855e57c07 Update changelog.
Thanks to xet7.
2026-09-08 23:03:22 +03:00
Lauri Ojansivu 063bb9d4eb Never let a Docker registry overview sync fail a release.
v11.62's release-all.yml run failed the whole "docker" job with 403 from both
Docker Hub and Quay.io on the repository-overview PATCH/PUT calls added
earlier, even though the image itself had already been built, pushed and
verified pullable by the steps before it. DOCKERHUB_AUTH/QUAY_AUTH are scoped
for `docker login`/image push, and neither registry grants a push-scoped
token the broader (account-owner / repo-admin) rights a description write
needs - so the sync step's own `exit 1` failed a job that had, in fact,
already published, which blocked every downstream job gated on
`needs.docker.result == 'success'` (the Helm chart update).

A stale repository description is not worth failing a release over: the sync
step now reports each registry's failure as ::warning:: rather than
::error::, drops the shared `fail` flag, and always exits 0. Each registry
is still attempted independently. Logs (.tools/wekan11) confirm the actual
image push, manifest verification and anonymous-pull checks all succeeded
for v11.62; only this cosmetic step was ever the problem.

Thanks to xet7.
2026-09-08 23:03:22 +03:00
Lauri Ojansivu f663b8f945 Update changelog.
Thanks to xet7.
2026-09-08 23:03:22 +03:00
Lauri Ojansivu 1f9104a545 Exempt registry-overview PATCH/PUT calls from the retry-download guard.
tests/releaseDownloads.test.cjs requires every curl in the release workflows
to go through fetch.sh's retry/backoff, since an unretried download has lost
a release to a transient outage before. The Docker Hub/Quay.io overview-sync
step added earlier uses curl -X PATCH/-X PUT directly, same as the adjacent
-X POST login call already exempted: failing to update a repository
description does not lose a release the way a failed binary download does,
and the step already reports and isolates its own failure. Extend the
existing -X POST exemption to also cover PATCH and PUT.

Thanks to xet7.
2026-09-08 23:03:22 +03:00
Lauri Ojansivu 83fa2d341c Stop leaving an empty Upcoming placeholder, move the binaries table to the end.
CHANGELOG.md no longer carries an empty "# Upcoming WeKan (R) release" section
with an "In short: nothing here yet." placeholder between releases.
release-all.sh used to auto-create one immediately after renaming a release
(via the now-deleted releases/changelog-open-next.mjs), so the file always
had a section that said nothing until the first real entry replaced it.
Add the Upcoming section yourself, by hand, the moment there is a real entry
for it, using the skeleton at
docs/DeveloperDocs/Changelog-Upcoming-Template.md. What actually prevents an
entry from landing inside an already-published release -
tests/changelogEntriesBelongToTheirRelease.test.cjs asking git which commits
a release contains - never depended on the placeholder existing first, so
removing it costs nothing.

Also reorders each release section: the binaries table used to sit right
under the "In short" summary; it now comes LAST, under its own "Binaries in
these bundles:" label, after every content subsection and right before the
closing "Thanks to above GitHub users" line. A reader opens a release to see
what changed; the platform/SHA256 table is reference material, not the
second thing anyone reads.

Updated CLAUDE.md/AGENTS.md's CHANGELOG format spec and
tests/changelogFormat.test.cjs to match both changes, and
tests/buildScriptParity.test.cjs now that changelog-open-next.mjs is gone.

Thanks to xet7.
2026-09-08 23:03:22 +03:00
Lauri Ojansivu 4f0098401b Update changelog.
Thanks to xet7.
2026-09-08 23:03:22 +03:00
Lauri Ojansivu 96157ef41c Stop release-all.sh from inheriting and widening a version-number gap.
The next release version was computed by measuring the gap between the two
newest "# vNN.MM" headings in CHANGELOG.md and re-applying that same gap,
instead of always advancing by one. That is not self-correcting: if a release
number was ever prepared and never published, and its CHANGELOG section was
deleted outright instead of renamed back to "# Upcoming WeKan (R) release"
(this script's own documented recovery for a release that never published),
the two remaining headings were left 2 apart. The script read that as "the
cadence is +2 now" and reapplied it every following release, turning one
incident into a permanent, ever-widening habit of skipping a number - exactly
how v11.56 -> v11.58 -> v11.60 -> v11.62 happened, silently skipping v11.57,
v11.59 and v11.61 (v11.33 and v11.54 were skipped by the same bug earlier).

The step is now a fixed +1 with no history lookup, and the other code path
(resuming an already-renamed release) hard-fails instead of printing
"proceeding anyway" when the newest heading is not exactly +1 from the
previous one, so a future gap is caught before it can be built on.

tests/releaseAllVersionStep.test.cjs pins the fixed +1 step and the hard
failure. The GitHub workflow itself (release-all.yml) needed no change: it
only ever uses the old_version/new_version this script hands it and never
computes a step of its own.

Thanks to xet7.
2026-09-08 23:03:22 +03:00
github-actions[bot] 57225214bf Bump versions for v11.62 2026-09-08 18:36:25 +00:00
Lauri Ojansivu 73747a92a3 Prepare v11.62 release 2026-09-08 21:35:11 +03:00
Lauri Ojansivu a2b758b018 Updated readme 2026-09-08 21:31:59 +03:00
Lauri Ojansivu 9df82ccdff Updated readme 2026-09-08 21:24:40 +03:00
Lauri Ojansivu d86800d68b Updated translations. 2026-09-08 21:20:00 +03:00
Lauri Ojansivu a8f88bc1ef Update changelog.
Thanks to xet7.
2026-09-08 20:52:03 +03:00
Lauri Ojansivu 5abcb5f2f2 Fix Statistics view test for the Time-view split.
Time spent summary moved out of the Statistics view into its own Time view,
leaving statsView.jade with one .stats-view-table section (board status)
instead of two. The Playwright test still expected 2 tables and failed on
every browser; update it to expect 1.

Thanks to xet7.
2026-09-08 20:51:20 +03:00
Lauri Ojansivu a7419ba9a5 Fix Dockerfile's Meteor release pin after the 3.5.2 upgrade.
.meteor/release was bumped to METEOR@3.5.2 but Dockerfile's own
METEOR_RELEASE still said METEOR@3.5.2-rc.0, so
tests/releaseVersionConsistency.test.cjs failed with a version mismatch.

Thanks to xet7.
2026-09-08 20:51:20 +03:00
Lauri Ojansivu 34fa8fb77c Update changelog.
Thanks to xet7.
2026-09-08 19:21:14 +03:00
Lauri Ojansivu 395aa2b400 Sync Docker Hub and Quay.io overviews from README.md on release.
Neither registry updates its long-form repository description on its own, so
the overview shown on the repository page had drifted from what README.md
documents. Add a step to release-all.yml's docker job, after the multi-arch
image is built, pushed and verified pullable, that pushes README.md as the
overview: Docker Hub via login-for-JWT then PATCH full_description, Quay.io
via PUT description, reusing the DOCKERHUB_AUTH and QUAY_AUTH secrets already
decoded for docker login. GHCR needs no call since a linked package mirrors
its repository's README automatically. Add
tests/dockerRegistryOverviewSync.test.cjs to pin the endpoints, request
bodies, ordering and that no token is ever echoed.

Thanks to xet7.
2026-09-08 19:20:56 +03:00
Lauri Ojansivu e57797e72f Updated readme 2026-09-08 19:19:42 +03:00
Lauri Ojansivu aa6fdf557a Update changelog: Windows single-EXE CI smoke test fix
Thanks to xet7.
2026-09-08 19:05:38 +03:00
Lauri Ojansivu b34b036eb8 Fix the Windows single-EXE smoke test failing with no error message
.tools/wekan10's downloaded run logs showed "second run: WeKan answered
on port 8080 on its first attempt." print successfully, immediately
followed by "Process completed with exit code 1" - no thrown error
anywhere in between.

taskkill.exe (unlike a PowerShell cmdlet) sets $LASTEXITCODE, which
$ErrorActionPreference does not touch - that only governs PowerShell's
own errors, not a plain exe's exit code - and `pwsh -Command` exits with
whatever $LASTEXITCODE last held when the script itself never calls
`exit`. `taskkill /IM ferretdb.exe` (no matching process is a normal,
harmless outcome on the "second" run, once the first run's FerretDB is
already gone) was the LAST external command the whole step ran, so its
nonzero "no such process" exit code alone failed the step.

Reset $LASTEXITCODE after every taskkill call in this workflow whose own
exit code is not being checked - the same latent bug was present in the
"Free ports used by the packaged EXE" step's port-cleanup loop too,
which could fail the same way if the last PID it tried had already
exited between netstat and taskkill.

Thanks to xet7.
2026-09-08 19:03:49 +03:00
Lauri Ojansivu 8d0b4c1082 Update changelog: Board View menu label translation fix
Thanks to xet7.
2026-09-08 18:46:55 +03:00
Lauri Ojansivu a5e74972d2 Translate the Board View menu's "not implemented yet" labels
An earlier version hardcoded the English word itself inside the
parentheses (e.g. "(Burndown)"), so on an otherwise fully translated
menu these ten entries read as a leftover bug rather than a "coming
soon" marker - the page each one opens was already correctly translated,
since its own title uses the same key (.tools/board-view.png: Finnish
throughout except this one menu). The literal parentheses are what say
"not implemented yet"; the word inside them is now translated like every
other entry, through the exact key the placeholder page's title uses.

Thanks to xet7.
2026-09-08 18:46:19 +03:00
Lauri Ojansivu 6714747d00 Removed fork of meteor-node-stubs, using npm package instead.
Thanks to xet7 !
2026-09-08 18:40:39 +03:00
Lauri Ojansivu ca8105d32f Updated Rspack.
Thanks to developers of Rspack !
2026-09-08 18:27:44 +03:00
Lauri Ojansivu f6220a3332 Added list of charts that are upcoming to board views.
Thanks to xet7 !
2026-09-08 18:24:13 +03:00
Lauri Ojansivu ed8ae796ad Upgraded to Meteor 3.5.2 .
Thanks to Meteor developers !
2026-09-08 18:23:33 +03:00
Lauri Ojansivu b28a05db77 Update changelog: Calendar view toolbar layout fix
Thanks to xet7.
2026-09-08 18:18:45 +03:00
Lauri Ojansivu e0e03e2003 Move all Calendar view toolbar buttons to the right of the title
Today/Previous/Next were their own group under the title, with the
Day/Week/Month view toggles in a third, CENTER group that pushed
everything onto a second row (.tools/calendar.png). All the buttons now
sit together in one group on the right of the title, which stays alone
on the left and is vertically centered against them - WeKan's global
`h2 { margin: 0 0 7px }` otherwise offset the title (an <h2>) from that
row.

Thanks to xet7.
2026-09-08 18:17:54 +03:00
Lauri Ojansivu 10fa006448 Update changelog: Board Table view toolbar tooltips and centering
Thanks to xet7.
2026-09-08 18:07:09 +03:00
Lauri Ojansivu 663a5a1cc6 Vertically center the Board Table view toolbar's controls
The search input, Search button, pagination buttons and the two toggle
buttons sit in one flex row with align-items: center - but a flex child
never shrinks below its own content's minimum height no matter what the
container measures, so the Search button's bold label pushed it visibly
taller/lower than the search input beside it (.tools/button-center.png).
Every control now shares one explicit border-box height (34px) with
line-height: 1, so there is nothing left for align-items: center to fail
to center.

Thanks to xet7.
2026-09-08 18:04:50 +03:00
Lauri Ojansivu 7b6b9d519a Add descriptive tooltips to the Board Table view toggle buttons
The "wrap card titles" and "group by swimlane" toggle buttons had bare
one-word tooltips ({{_ 'card'}}, {{_ 'swimlane'}}) that said neither what
clicking them does nor which of the two states is currently on. Each now
has a state-aware tooltip/aria-label ("Card titles wrap to multiple
lines. Click to truncate them with an ellipsis instead." and the same
shape for swimlane grouping), translated into all 234 locales.

Thanks to xet7.
2026-09-08 18:04:40 +03:00
Lauri Ojansivu 3fdf753bf2 Update changelog: OIDC redirect-login loop fix (#6681)
Thanks to Alishara and xet7.
2026-09-08 17:53:58 +03:00
Lauri Ojansivu 89682c251f Fix OIDC auto-redirect looping until the provider rate-limits it
With oauth2-login-style redirect and OIDC_REDIRECTION_ENABLED, the browser
looped between WeKan and the identity provider until the provider started
rate-limiting the repeated /authorize requests.

Template.userFormsLayout.onCreated (client/components/main/layouts.js)
fired the auto-redirect unconditionally on every render. Meteor's
redirect-style OAuth has no dedicated callback route - the identity
provider's callback bounces the browser back to this SAME sign-in page -
and the login method that follows a successful callback completes
asynchronously, racing this template's own re-render. When the
auto-redirect check ran before that login had finished, it saw "not
logged in yet" and fired a brand new navigation straight back to the
provider, forever.

Fixed with a one-shot sessionStorage flag (client/lib/oidcAutoRedirect.js)
that survives the full-page round trip to the provider and back, so the
bounce-back render does not re-fire the redirect. Cleared on both login
success and login failure (config/accounts.js), so a later logout, or a
genuine error, can still trigger the auto-redirect again rather than
leaving the sign-in page permanently stuck the other way.

Thanks to Alishara and xet7 !

Fixes #6681,
2026-09-08 17:52:54 +03:00
Lauri Ojansivu a48819ae9a CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-08 17:49:28 +03:00
Lauri Ojansivu ff39102cdb Update changelog: Board Table view pagination button theme
Thanks to xet7.
2026-09-08 17:49:26 +03:00
Lauri Ojansivu 2d89c086a1 Theme Board Table view's pagination buttons like the Search button
The prev/next page buttons were plain white with a grey border, unlike
the blue "Search" button right next to them in the same control row -
the two read as different UI families instead of one toolbar
(.tools/table-view screenshots).

Thanks to xet7.
2026-09-08 17:49:26 +03:00
Lauri Ojansivu cd5fde0679 Update changelog: Gantt reordered, Dashboard marked unfinished
Thanks to xet7.
2026-09-08 17:49:26 +03:00
Lauri Ojansivu 02449c0d0e Move Gantt between Statistics and Dashboard, mark Dashboard unfinished
<hr> between Gantt and Dashboard, matching the menu's existing grouping.
Dashboard now shows the same hardcoded, untranslated "(Dashboard)" label
the other nine not-yet-built views already carry - it was translated by
oversight, which said the view was finished when it is a placeholder page
like the rest of them.

Thanks to xet7.
2026-09-08 17:49:26 +03:00
Lauri Ojansivu 794098e298 Update changelog: hardcoded list width, removed set-width/height popups
Thanks to xet7.
2026-09-08 17:49:26 +03:00
Lauri Ojansivu 8614949580 Hardcode list width to 240px and remove the width/height set-value popups
List width is now a single hardcoded constant (models/lib/listWidth.js,
240px) applied to every list on every board for every viewer. This
replaces the #5659/#5729/#6409 model built up over time: a personal
per-user width, a per-list shared width, a viewer-toggled "same width for
all lists" mode, and a viewer-toggled auto-width mode. All of it - the
"Set width" list-menu popup, the board-settings "Personal list width"
sidebar toggle, the drag-resize handle, and every schema field and Meteor
method behind them - is removed rather than left dead.

The "Set swimlane height" menu popup goes too, as a redundant text-input
alternative to the working drag-resize handle from the swimlane-resize fix
earlier this release; that drag handle itself is untouched.

Two knock-on fixes this surfaced: models/wekanCreator.js was still mapping
the now-removed allowsPersonalListWidth/autoWidth board fields on WeKan
JSON import, which would have failed schema validation on any import; and
the CloneBleed security-regression test's applyListWidth sub-suite tested
a method that no longer exists, replaced with a comment pointing at
tests/listWidthDefaults.test.cjs's negative coverage of the removal.

tests/listWidthPopupLayout.test.cjs and
tests/playwright/specs/38-fixed-list-width.e2e.js tested only the removed
feature and are deleted outright; listWidthDefaults.test.cjs and
listWidthDuringDrag.test.cjs are rewritten/adjusted for the new model.

Thanks to xet7.
2026-09-08 17:49:26 +03:00
Lauri Ojansivu d7f3f4c233 Update changelog: Set width popup layout fix
Thanks to xet7.
2026-09-08 17:49:26 +03:00
Lauri Ojansivu 04d909b7aa Stack "Same width for all lists" below "Auto list width"
Both are `a` toggles in the "Set width" popup (setListWidthPopup) with no
display rule of their own, so the browser default (inline) put them side
by side on one crowded line (.tools/same-width.png) instead of stacked
rows like the rest of the popup.

Thanks to xet7.
2026-09-08 17:49:26 +03:00
Lauri Ojansivu dabf3704ec Update changelog: Board View menu separators and unfinished-view labels
Thanks to xet7.
2026-09-08 17:49:26 +03:00
Lauri Ojansivu 14136a5b0c Group the Board View menu with separators and mark unfinished views
<hr> separators, matching the right sidebar's own hr-separated groups:
one between Table and Calendar, one between Time and Statistics.

Nine views with no implementation behind them yet (Burndown, Burnup,
Cumulative Flow, Control, Cycle Time, Flow Efficiency, Lead Time,
Throughput Histogram, WIP Run) show a hardcoded "(Name)" label instead of
a translated one - translating them as if they were finished feature
names, like every other entry, would not say in any language that the
view behind them is just a grey placeholder page. Dashboard is left
translated; it is not on the maintainer's list of nine.

Thanks to xet7.
2026-09-08 17:49:25 +03:00
Lauri Ojansivu 9d5662a9c3 Update changelog: Board View menu, swimlane resize, collapse caret
Document this batch under Upcoming: the Board View menu reorder and its
new placeholder/Time views, the dependency-line/collapsed-list bleed fix
on swimlane resize, and the collapse-caret positioning fix.

Thanks to xet7.
2026-09-08 17:49:25 +03:00
Lauri Ojansivu 0f56a3344b Move an expanded list's collapse caret to its header's top corner
The caret rendered as a plain in-flow sibling before the title, which put
it on the row with the card count and the +/menu icons - visually
unrelated to either the title it collapses or that menu. Nesting it inside
the title heading was tried first and reverted: that heading carries
js-open-inlined-form/is-editable, so a click on the caret bubbled up and
opened the rename form instead of collapsing the list (.tools/list1).

Fixed by floating the caret to the START of the header's top content line
- list.css already floats .list-header-menu (the hamburger/+ icons) to the
END of that same line - so the caret lands level with that menu, at the
header's top corner: the left edge for LTR, the right for RTL, from the
logical float value with no extra rule needed. The collapsed state is
unchanged: its caret stays a sibling before .list-rotated, absolutely
positioned against .list-header as before.

Thanks to xet7.
2026-09-08 17:49:25 +03:00
Lauri Ojansivu 17b5664f09 Widen a stale slice window in the board-view tooltip name test
headerBars.test.cjs read a fixed 700-character window after
boardViewName() to check every view has a translated tooltip name; that
window was sized for the original six views and silently stopped covering
the eleven added since (c11c1e17f), so it could not have caught them being
missing there.

Thanks to xet7.
2026-09-08 17:49:25 +03:00
Lauri Ojansivu 24199bb1df Fix dependency lines and collapsed lists bleeding past a resized swimlane
Two independent causes (screenshots in .tools/drag):

1. `.swimlane.swimlane-resizing` forced `overflow: visible !important` for
   the whole drag, so a collapsed list (a fixed 540px tall, list.css) kept
   painting past a swimlane being dragged shorter, on top of the swimlane
   below it. Now `hidden`, matching what the swimlane clips to once the
   drag ends anyway.

2. dependencyOverlay.js (the "red string" dependency-line SVG) only ever
   redraws on scroll or a window resize; changing a swimlane's own height
   via drag fires neither, so a line kept the coordinates a card had BEFORE
   the resize - stale positions that can lie on top of the next swimlane
   once the real card is scrolled/clipped out of view. Fixed by (a)
   swimlanes.js dispatching a dedicated event on every height change, which
   the overlay listens for, and (b) the overlay no longer drawing to/from a
   card with no on-screen area left once every clipping ancestor is
   accounted for. A line between two cards in the SAME now-shrunk swimlane
   disappears when its card does; a line to a DIFFERENT, still-visible
   swimlane's card is unaffected, since that card's own visibility is
   checked independently - dependencies that genuinely cross swimlanes are
   supposed to be drawn there.

Thanks to xet7.
2026-09-08 17:49:25 +03:00
Lauri Ojansivu 876b0a2c12 Reorder the Board View menu and add its not-yet-built views
New order top to bottom: Swimlanes, Lists, Table, Calendar, Time,
Statistics, Dashboard, Burndown, Burnup, Cumulative Flow, Control, Cycle
Time, Flow Efficiency, Gantt, Lead Time, Throughput Histogram, WIP Run -
each with its own font-awesome icon. The ten views with no implementation
yet get a real grey page (client/components/boards/chartPlaceholderViews.jade)
titled like their menu entry, with a shared "not implemented yet" note,
instead of a menu item that opens nothing.

"Time spent summary" moves out of Statistics into its own new Time view
(timeView.jade/.js), which keeps the same boardStatus subscription
Statistics already used.

Two places had to learn every new view or switching to one silently failed:
models/users.js's profile.boardView schema only allowed the original six
values, so the server rejected Meteor.call('setBoardView', ...) for any new
one with a 400; and boardHeader.js's tooltip name map fell back to a
generic label for the same ones. tests/boardViewMenu.test.cjs pins the
menu order, that every entry has an icon/handler/isView* helper/placeholder
template, AND both of those - the schema and the tooltip map - against the
same view list, so this cannot drift out of sync silently again.

Thanks to xet7.
2026-09-08 17:49:25 +03:00
Lauri Ojansivu db94c81228 Update changelog: test-menu.sh, markdown import/export, TODO Later
Document this batch of work under Upcoming, and record under TODO Later
what it deliberately left for later: Jira, Kanboard, NextCloud Deck,
OpenProject, Asana and Zenkit are still the thin best-effort stubs from
when the shared import/export plumbing landed, each needing its own
fixture/spec pass the way GitHub just got one; and further formats (the
Leo literate editor's .leo outline format and others) were not researched
or built, each costing roughly what Markdown just cost including a new
string across all 234 locales.

Thanks to xet7.
2026-09-08 17:49:24 +03:00
Lauri Ojansivu 237b4f3f88 Add Markdown import/export and give GitHub-style import loss reporting
The GitHub/Gitea/Forgejo issue importer (models/lib/externalParsers.js)
mapped only a title, description, one assignee and a due date, silently
dropping everything else. It now also carries a second-and-later assignee,
a milestone title, a non-"completed" state reason and embedded comments
(as tags/description, since the shared Kanboard shape has no field for
them), and returns an `unsupported` list of what it genuinely could not
place - the `{ normalized, warnings, unsupported }` contract from
docs/Features/ImportExport/Format-Coverage.md, flattened onto the existing
board/columns/swimlanes/tasks shape so the KanboardCreator call site in
models/import.js is unaffected.

Markdown is a new import/export format: the "## List name" / "- [ ]"/"- [x]"
task-list convention several markdown-kanban tools use (Obsidian Kanban and
similar) - a plain bulleted list with no checkboxes still imports as open
cards. models/lib/markdownKanbanFormat.js holds the pure formatter (no
Meteor import of its own, so it and the parser are unit-testable without a
server); models/lib/externalParsers.js's parseMarkdownKanban is the import
side. Wired into the import source list and the export menu; the export
route serves plain text/markdown rather than JSON, since the whole point is
a file readable/editable directly or opened by another markdown-kanban tool.

Thanks to xet7.
2026-09-08 17:49:24 +03:00
Lauri Ojansivu 4f35d5225f Fix a wrapped changelog summary line
A <summary> line must be on one line - a wrapped one renders its second
line as literal text instead of part of the link. changelogFormat.test.cjs
already checks this; it was failing before this fix.

Thanks to xet7.
2026-09-08 17:49:24 +03:00
Lauri Ojansivu 1218cd281f Add test-menu.sh and checked-in example inputs for docs/Features
test-menu.sh mirrors the docs/Features menu structure and runs the actual
WeKan code for each feature: a dedicated runner for Login (a real REST
username/password round trip) and ImportExport/PDF (create a board, export
it, check the PDF header), and a generic fallback that matches a feature
against this repo's own automated tests by filename. Every feature run
writes output.txt/result.txt/run.log under .tools/test-menu/<timestamp>/,
mirroring the docs/Features path, and never leaves an empty or missing
result.

The example INPUT for a feature is checked into the repository next to its
documentation instead: docs/Features/<path>/example-input.txt, hand-written
for Login and ImportExport/PDF and extracted from the feature's own .md
elsewhere. test-menu.sh only reads these; it never writes into docs/Features.

An earlier version of the matcher also grep'd test file CONTENTS for a
keyword once the filename search failed, which pulled in noise (a word like
"webhook" mentioned in passing in a dozen unrelated tests); it is
filename-only now.

Thanks to xet7.
2026-09-08 17:49:24 +03:00
github-actions[bot] 071a6348b3 Bump versions for v11.60 2026-09-08 10:38:19 +00:00
Lauri Ojansivu 597db15f1a Prepare v11.60 release 2026-09-08 13:37:09 +03:00
Lauri Ojansivu 86cd698981 Document test-menu.sh in the changelog 2026-09-08 13:36:19 +03:00
Lauri Ojansivu 3085e32fe3 Add test-menu.sh, a docs/Features-shaped interactive test menu
The menu and its submenus are read live from docs/Features, so they can
never drift from it: a folder is a submenu, a folder with no subfolders of
its own is a runnable leaf, menu 1 always runs every feature, and 0 goes
back/exits. Login and ImportExport/PDF are wired to real WeKan server code -
a REST username/password login round trip and a board create-then-export-PDF
call - reusing an already-running WeKan or starting the precompiled
.build/bundle if one exists. Every other leaf falls back to running this
repo's own matching tests/*.test.cjs, which is a real, working way to
exercise a feature without a dedicated runner.

Each run's starting command, log and any produced files (e.g. the exported
PDF) are saved under .tools/test-menu/YYYY-MM-DD_HH-MM-SS/, mirrored into the
same subfolders as docs/Features.
2026-09-08 13:35:38 +03:00
Lauri Ojansivu 21146cbd35 Document branding image URL revert 2026-09-08 03:24:19 +03:00
Lauri Ojansivu f07e2e69b7 Revert branding and board background images to external URLs
Restore editable external image URL fields for the login logo, top-left
corner logo, and board backgrounds, and undo the switch to server-side
download-and-convert-to-GIF storage. Uploading is still available as an
option alongside the URL field for boards; instance and Organization
branding again accept a direct image URL. Imports may again carry
Trello's and WeKan's external background URLs. Tests updated to match.
2026-09-08 03:23:28 +03:00
Lauri Ojansivu 6722a11d90 Update changelog 2026-09-07 22:09:22 +03:00
Lauri Ojansivu cff635d662 11.58 2026-09-07 21:55:07 +03:00
github-actions[bot] f5fbda6ea6 Bump versions for v11.58 2026-09-07 18:54:42 +00:00
Lauri Ojansivu 1fddf4ab72 Prepare v11.58 release 2026-09-07 21:53:26 +03:00
Lauri Ojansivu a5a9baac6f 11.57 2026-09-07 21:53:18 +03:00
github-actions[bot] cbe210d0b4 Bump versions for v11.56 2026-09-07 17:28:13 +00:00
Lauri Ojansivu bafcf6eefc Prepare v11.56 release 2026-09-07 20:27:09 +03:00
Lauri Ojansivu 18260a24d9 Document repaired alltests coverage
Thanks to xet7.
2026-09-07 20:13:29 +03:00
Lauri Ojansivu 793f760ea8 Fix alltests fixtures and HTTP cookie assertions
Exclude generated Playwright artifacts from documentation coverage, follow current Finnish translations, keep report fixtures within display limits and provide valid attachment metadata. Require the named HttpOnly login cookie on both transports and Secure on HTTPS.

All 790 Node suites and 15 targeted HTTP/HTTPS browser checks pass.

Thanks to xet7.
2026-09-07 20:13:04 +03:00
github-actions[bot] 47a29299a3 Bump versions for v11.55 2026-09-07 14:48:31 +00:00
Lauri Ojansivu 1fd544e487 Prepare v11.55 release 2026-09-07 17:47:30 +03:00
Lauri Ojansivu 2037d4acb3 Document control color reverts and verified session migration 2026-09-07 17:39:00 +03:00
Lauri Ojansivu 2f82d985e2 Migrate legacy sessions without repeating the initial login
The extra resume introduced in 9f47f00cf rebuilds subscriptions after Accounts has already restored the session. Browser DDP diagnostics reproduce an empty profile while the user ID remains logged in and the database profile is unchanged. Transfer the existing credential and expiry to memory, remove the persistent copy and use the native validated cookie endpoint without another login. Keep the token poll in sync.

Extend the regression beyond checking user ID: verify the name, avatar and header color after the poll interval, edit the name and color, favorite the board, change to list view and reload using only the HttpOnly cookie. Chromium and Firefox pass at testi.wekan.fi; unit cases cover completed and pending initial resumes and cookie-only startup.

Thanks to Alishara and xet7 !

Fixes #6677,
2026-09-07 17:38:22 +03:00
Lauri Ojansivu 0f8990bccf Revert swimlane and card control title-color matching
Restore independent swimlane control and hover colors and the previous card control styling. Reverse the client changes from fa8c3959c and ebb35af50 and update regression coverage for the restored behavior. Verify the computed colors in Chromium and Firefox at testi.wekan.fi.

Thanks to Alishara and xet7 !
2026-09-07 17:38:08 +03:00
Lauri Ojansivu 1516d07e79 Record successful live browser validation
Thanks to xet7 !
2026-09-07 17:16:39 +03:00
Lauri Ojansivu 713ac69ace Support live HTTPS browser validation
Restore HTTPS transport selection in Playwright readiness checks. Wait for the rendered board denial instead of network silence so SockJS polling cannot time out the non-member test.

Eight live checks pass at https://testi.wekan.fi across Chromium and Firefox, covering standard Meteor sign-in, JavaScript-disabled responses, board loading and non-member denial. The HTTPS readiness regression also passes.

Thanks to xet7 !
2026-09-07 17:16:17 +03:00
Lauri Ojansivu 995e79ae22 Document Legacy HTML4 revert
Thanks to xet7 !
2026-09-07 17:04:23 +03:00
Lauri Ojansivu 828fc2d718 Revert Legacy HTML4 browser interface and parity changes
Remove the progressive HTML4/Legacy Omi middleware, cookieless sessions, page controllers, assets, parity refactors, design documents and associated tests. Restore the standard Meteor interface and operations from before the HTML4 work began.

Preserve intervening translations, backup screenshots, session upgrades, cryptographic test identifiers, local image storage, document previews and lazy browser loading. Extract the GIF utilities still required by image features into imageGif.

Validate the Node suites and add standard-interface and GIF regressions. Two existing failures remain in docsLinksResolve and ruleDetailsLocalization; browser regressions are registered but require a running server.

Thanks to xet7 !
2026-09-07 17:03:59 +03:00
Lauri Ojansivu afd51b2760 Record paused Legacy HTML4 work 2026-09-07 16:39:47 +03:00
Lauri Ojansivu 4c948a4141 Document Legacy HTML4 card deletion 2026-09-07 16:38:13 +03:00
Lauri Ojansivu 18fafa5b0c Add Legacy HTML4 card deletion 2026-09-07 16:35:27 +03:00
Lauri Ojansivu 87110ef5e3 Document Legacy HTML4 copy many cards 2026-09-07 16:27:39 +03:00
Lauri Ojansivu d66ef0b37d Add Legacy HTML4 copy many cards 2026-09-07 16:26:45 +03:00
Lauri Ojansivu 7361aaf1e9 Document Legacy HTML4 card history 2026-09-07 16:17:37 +03:00
Lauri Ojansivu d27e22d120 Add Legacy HTML4 card history 2026-09-07 16:17:05 +03:00
Lauri Ojansivu 894ace7e87 Document Legacy HTML4 card transfers 2026-09-07 15:55:03 +03:00
Lauri Ojansivu 88e6c3b594 Add Legacy HTML4 card transfers 2026-09-07 15:54:28 +03:00
Lauri Ojansivu 0511014919 Document Legacy HTML4 card destinations 2026-09-07 15:43:50 +03:00
Lauri Ojansivu 9d5866e84c Add Legacy HTML4 card destination operations 2026-09-07 15:42:43 +03:00
Lauri Ojansivu 2ca7c71a90 Document Legacy HTML4 Trello API imports 2026-09-07 15:19:36 +03:00
Lauri Ojansivu 6a4ce04e2b Add Legacy HTML4 Trello API imports 2026-09-07 15:19:09 +03:00
Lauri Ojansivu 9a5926529e Updated translations. 2026-09-07 15:05:45 +03:00
Lauri Ojansivu c6732e81ce Document Legacy HTML4 Trello workspaces 2026-09-07 15:03:32 +03:00
Lauri Ojansivu c0492e13d3 Preserve Trello workspaces in Legacy HTML4 imports 2026-09-07 15:02:48 +03:00
Lauri Ojansivu 263a6056c3 Document HTML4 import member mapping 2026-09-07 14:10:22 +03:00
Lauri Ojansivu 80dd9585d1 Add HTML4 import member mapping 2026-09-07 14:09:06 +03:00
Lauri Ojansivu 97c547ee3c Document cryptographic Playwright identifiers 2026-09-07 13:50:28 +03:00
Lauri Ojansivu 4e83304d43 Use cryptographic randomness in Playwright tests 2026-09-07 13:49:44 +03:00
Lauri Ojansivu c31a7d8187 Document Legacy HTML4 linked card privacy 2026-09-07 13:33:22 +03:00
Lauri Ojansivu a5acea6fde Protect Legacy HTML4 linked card content 2026-09-07 13:32:36 +03:00
Lauri Ojansivu bf8ce99924 Keep temporary files under .tools 2026-09-07 13:30:52 +03:00
Lauri Ojansivu eba58fdb88 Document session upgrade profile fix
Thanks to Alishara and xet7 !

Fixes #6677,
2026-09-07 13:23:12 +03:00
Lauri Ojansivu 9f47f00cf6 Preserve profiles across HttpOnly session upgrades
Capture and resume the pre-upgrade browser token before Accounts.config replaces local storage with its in-memory store. This prevents the existing token poll from logging the user out and discarding reactive profile settings after upgrading from v11.39, while completing migration to the native HttpOnly cookie flow. Add static positive and negative guards plus a browser upgrade regression covering identity and board preferences beyond the poll boundary.

Thanks to Alishara and xet7 !

Fixes #6677,
2026-09-07 13:22:50 +03:00
Lauri Ojansivu eabe5f8f61 Document Legacy HTML4 Card Settings parity 2026-09-07 13:05:39 +03:00
Lauri Ojansivu 59e4f1fe2f Honor Card Settings in Legacy HTML4 2026-09-07 13:05:14 +03:00
Lauri Ojansivu f7d5b5d0d1 Added backup screenshots. 2026-09-07 12:58:29 +03:00
Lauri Ojansivu f642992eed Document Legacy HTML4 card covers 2026-09-07 12:56:33 +03:00
Lauri Ojansivu 86bf8dca86 Identify card covers in Legacy HTML4 2026-09-07 12:56:12 +03:00
Lauri Ojansivu 6d5be1d5c8 Document Legacy HTML4 card numbers 2026-09-07 12:50:36 +03:00
Lauri Ojansivu 5473560929 Show card numbers in Legacy HTML4 titles 2026-09-07 12:50:17 +03:00
Lauri Ojansivu 88775b37bf Document Legacy HTML4 card date format parity 2026-09-07 12:45:00 +03:00
Lauri Ojansivu 7f6ccb72f9 Add Legacy HTML4 card date format parity 2026-09-07 12:44:24 +03:00
Lauri Ojansivu d114ecc30a Document accessible HTML4 media previews 2026-09-07 12:23:15 +03:00
Lauri Ojansivu cde8d53f47 Add accessible HTML4 media previews 2026-09-07 12:22:52 +03:00
Lauri Ojansivu 2caff37eae Document accessible HTML4 text previews 2026-09-07 12:16:42 +03:00
Lauri Ojansivu 7ccc0d0202 Add accessible HTML4 text previews 2026-09-07 12:16:22 +03:00
Lauri Ojansivu 9f67375587 Document shared Legacy HTML4 status component 2026-09-07 12:08:52 +03:00
Lauri Ojansivu 9ec3723fe6 Share Legacy HTML4 status component 2026-09-07 12:08:24 +03:00
Lauri Ojansivu 8e610ffa08 Audit Legacy HTML4 route inventory 2026-09-07 12:07:39 +03:00
Lauri Ojansivu 0ad8acb240 Verify Legacy HTML4 not found parity 2026-09-07 12:06:45 +03:00
Lauri Ojansivu 61af077b0d Link verified Legacy HTML4 not found response 2026-09-07 12:03:41 +03:00
Lauri Ojansivu 99b9a1879f Return HTTP 404 for Legacy HTML4 unknown routes 2026-09-07 12:03:16 +03:00
Lauri Ojansivu 5cbd384047 Document semantic Legacy HTML4 not found page 2026-09-07 11:59:45 +03:00
Lauri Ojansivu 915eec906f Add semantic Legacy HTML4 not found page 2026-09-07 11:59:14 +03:00
Lauri Ojansivu cc09341f88 Document Legacy HTML4 Admin redirects 2026-09-07 11:58:02 +03:00
Lauri Ojansivu 97f2570d42 Match legacy HTML4 Admin redirects 2026-09-07 11:57:45 +03:00
Lauri Ojansivu 42746b3fc0 Document accessible HTML4 document previews 2026-09-07 11:54:11 +03:00
Lauri Ojansivu 39671b13e5 Add accessible HTML4 document previews 2026-09-07 11:53:41 +03:00
Lauri Ojansivu 689a393841 Document accessible member invitation and logout 2026-09-07 11:08:17 +03:00
Lauri Ojansivu 2e300f7f22 Add accessible member invitation and logout 2026-09-07 11:07:35 +03:00
Lauri Ojansivu 7f1042d213 Document accessible member avatar 2026-09-07 10:50:47 +03:00
Lauri Ojansivu 4f27463581 Add accessible member avatar page 2026-09-07 10:49:36 +03:00
Lauri Ojansivu 71bba91e8e Document accessible member appearance 2026-09-07 10:34:10 +03:00
Lauri Ojansivu b55df82f86 Add accessible member appearance pages 2026-09-07 10:32:42 +03:00
Lauri Ojansivu 333c5f527c Document accessible member settings 2026-09-07 10:22:42 +03:00
Lauri Ojansivu 7bfd843746 Add accessible member settings page 2026-09-07 10:22:11 +03:00
Lauri Ojansivu 523b6312e8 Document accessible member password 2026-09-07 10:18:45 +03:00
Lauri Ojansivu 5e8946c468 Add accessible member password page 2026-09-07 10:18:11 +03:00
Lauri Ojansivu 3e129215cb Document accessible member language 2026-09-07 10:13:42 +03:00
Lauri Ojansivu fc182fb079 Add accessible member language page 2026-09-07 10:13:13 +03:00
Lauri Ojansivu 92e01e2bd0 Document accessible member profile 2026-09-07 10:08:23 +03:00
Lauri Ojansivu 8c36df39e1 Add shared accessible member profile 2026-09-07 10:07:59 +03:00
Lauri Ojansivu f8e9c348ec Document Legacy HTML4 account tokens 2026-09-07 09:59:23 +03:00
Lauri Ojansivu 9fdb7d8a66 Add Legacy HTML4 account token flows 2026-09-07 09:58:46 +03:00
Lauri Ojansivu 1085adac6d Document Legacy HTML4 password recovery 2026-09-07 09:48:51 +03:00
Lauri Ojansivu 16a99ec186 Add Legacy HTML4 password recovery 2026-09-07 09:48:15 +03:00
Lauri Ojansivu 08bdd3c03c Document complete Legacy HTML4 attachments 2026-09-07 09:42:44 +03:00
Lauri Ojansivu 119c7f796f Complete Legacy HTML4 attachment settings 2026-09-07 09:41:53 +03:00
Lauri Ojansivu 3f6a0bdea2 Document Legacy HTML4 database migration 2026-09-07 09:36:59 +03:00
Lauri Ojansivu fdac604fcf Add Legacy HTML4 database migration 2026-09-07 09:35:48 +03:00
Lauri Ojansivu 2d150a8e91 Document Legacy HTML4 cloud attachment storage 2026-09-07 09:31:33 +03:00
Lauri Ojansivu d394b5629d Add Legacy HTML4 cloud attachment storage 2026-09-07 09:30:37 +03:00
Lauri Ojansivu 7f3affbf99 Document Legacy HTML4 local attachment storage 2026-09-07 09:24:36 +03:00
Lauri Ojansivu 3fb1914998 Add Legacy HTML4 local attachment storage 2026-09-07 09:23:45 +03:00
Lauri Ojansivu 59ca0bf627 Document Legacy HTML4 attachment movement 2026-09-07 09:20:03 +03:00
Lauri Ojansivu b7ef4dd92f Add Legacy HTML4 attachment movement 2026-09-07 09:19:18 +03:00
Lauri Ojansivu 3883e4f44c Document Legacy HTML4 attachment settings 2026-09-07 09:15:46 +03:00
Lauri Ojansivu 0733793039 Add Legacy HTML4 attachment storage controls 2026-09-07 09:14:37 +03:00
Lauri Ojansivu de146ed82e Document complete Legacy HTML4 People administration 2026-09-07 09:06:18 +03:00
Lauri Ojansivu 9d37bcbe36 Verify People security blocking 2026-09-07 09:05:58 +03:00
Lauri Ojansivu 552583412f Complete Legacy HTML4 People operations 2026-09-07 09:03:00 +03:00
Lauri Ojansivu 8ef621241e Document shared People creation and editing 2026-09-07 08:50:41 +03:00
Lauri Ojansivu 3b6a1d6354 Share secure People creation and editing 2026-09-07 08:49:58 +03:00
Lauri Ojansivu db716c3b51 Document Legacy HTML4 People discovery 2026-09-07 08:36:13 +03:00
Lauri Ojansivu 3e1f3cc16c Add Legacy HTML4 People discovery and account state 2026-09-07 08:34:36 +03:00
Lauri Ojansivu 127023ae6a Document Legacy HTML4 locked-user administration 2026-09-07 08:27:21 +03:00
Lauri Ojansivu 059a4dd104 Add complete Legacy HTML4 locked-user administration 2026-09-07 08:26:35 +03:00
Lauri Ojansivu 773b3402d8 Document Legacy HTML4 Teams administration 2026-09-07 08:19:44 +03:00
Lauri Ojansivu bc32e63132 Add complete Legacy HTML4 Teams administration 2026-09-07 08:19:04 +03:00
Lauri Ojansivu 06bb26f877 Document Legacy HTML4 Organizations administration 2026-09-07 08:14:02 +03:00
Lauri Ojansivu b494f429cd Add complete Legacy HTML4 Organizations administration 2026-09-07 08:12:24 +03:00
Lauri Ojansivu e5f14c7027 Document Legacy HTML4 domain report 2026-09-07 07:57:59 +03:00
Lauri Ojansivu 2e8fdf8d3d Add Legacy HTML4 domain report 2026-09-07 07:57:24 +03:00
Lauri Ojansivu bf09fe7197 Document Legacy HTML4 email administration 2026-09-07 07:51:19 +03:00
Lauri Ojansivu a6612a25c0 Add Legacy HTML4 email administration 2026-09-07 07:50:24 +03:00
Lauri Ojansivu bdfdf6a75d Document HTML4 Login settings 2026-09-07 07:31:44 +03:00
Lauri Ojansivu 83690596f6 Add accessible HTML4 Login settings 2026-09-07 07:30:58 +03:00
Lauri Ojansivu fda6ac0e6b Document HTML4 shared templates 2026-09-07 07:22:07 +03:00
Lauri Ojansivu 2127b44e52 Add accessible HTML4 shared templates 2026-09-07 07:21:04 +03:00
Lauri Ojansivu e60bca9353 Document HTML4 People roles
Record the shared invite-policy boundary, complete accessible Roles controls and capability table, repaired runtime translation feed, Admin Panel navigation coverage, live same-route screenshots, and remaining People and Attachments work.
2026-09-07 07:14:21 +03:00
Lauri Ojansivu 48bf99220b Add accessible HTML4 People roles
Share the invite-role policy service between Jade and semantic cookieless HTML4 controls, expose the enforced role capability matrix, and block direct DDP writes. Restore complete Admin Panel navigation and separate exact-language runtime translations from the bounded admin search publication.
2026-09-07 07:13:53 +03:00
Lauri Ojansivu 2456945cbb Document HTML4 translation settings
Record the completed seven-pane Settings coverage, the shared translation security and accessibility contract, live same-route verification, and the modern 25-row counter correction in the upcoming release notes.
2026-09-07 07:01:23 +03:00
Lauri Ojansivu bd0e7eb4c2 Add accessible HTML4 translation settings
Share bounded admin translation services between the modern and HTML4 views, keep literal search selectors server-owned, block and report direct DDP writes, and provide complete semantic create, edit, search, paging and confirmed-delete controls. Verify both views on the same live route and keep their 25-row counters aligned.
2026-09-07 06:59:57 +03:00
Lauri Ojansivu 02a5bbee0f Document accessible HTML4 Visibility settings 2026-09-07 06:47:45 +03:00
Lauri Ojansivu 174fb65c72 Add accessible HTML4 Visibility settings 2026-09-07 06:47:14 +03:00
Lauri Ojansivu b3158a87b3 Document secure HTML4 global webhooks 2026-09-07 06:33:02 +03:00
Lauri Ojansivu 51570b2c31 Add secure accessible HTML4 global webhooks 2026-09-07 06:30:47 +03:00
Lauri Ojansivu 4a775f45b7 Document secure accessible HTML4 PWA settings 2026-09-07 06:20:24 +03:00
Lauri Ojansivu 31a4c2fdc2 Add secure accessible HTML4 PWA settings 2026-09-07 06:19:26 +03:00
Lauri Ojansivu 93969fd79d Document accessible HTML4 Accessibility settings 2026-09-07 06:09:58 +03:00
Lauri Ojansivu 4b41897403 Add accessible HTML4 Accessibility settings 2026-09-07 06:08:46 +03:00
Lauri Ojansivu 36ede6be1b Document accessible HTML4 Announcement settings 2026-09-07 06:03:35 +03:00
Lauri Ojansivu b19cb2d631 Add accessible HTML4 Announcement settings 2026-09-07 06:02:57 +03:00
Lauri Ojansivu 5f35b17bb7 Document accessible HTML4 Version settings 2026-09-07 05:58:59 +03:00
Lauri Ojansivu 3916e4cad5 Add accessible HTML4 Version settings 2026-09-07 05:57:47 +03:00
Lauri Ojansivu 15f24e6d01 Document complete HTML4 Problems coverage 2026-09-07 05:50:52 +03:00
Lauri Ojansivu 8e112dc42b Verify complete HTML4 Problems coverage 2026-09-07 05:50:00 +03:00
Lauri Ojansivu 19fecd8f85 Document accessible HTML4 Notifications settings 2026-09-07 05:45:25 +03:00
Lauri Ojansivu 25ac420755 Add accessible HTML4 Notifications settings 2026-09-07 05:44:44 +03:00
Lauri Ojansivu daf830673c Document accessible HTML4 Delete settings 2026-09-07 05:41:10 +03:00
Lauri Ojansivu a99511c946 Add accessible HTML4 Delete settings 2026-09-07 05:40:32 +03:00
Lauri Ojansivu 4f2bf7d2e5 Document accessible HTML4 Security settings 2026-09-07 05:35:27 +03:00
Lauri Ojansivu 13dd0a0169 Add accessible HTML4 Security settings 2026-09-07 05:34:46 +03:00
Lauri Ojansivu 26ba1db460 Document accessible HTML4 Performance pane 2026-09-07 05:28:12 +03:00
Lauri Ojansivu 2047f59b34 Add accessible HTML4 Performance pane 2026-09-07 05:27:36 +03:00
Lauri Ojansivu 60fba583ed Document accessible HTML4 Rules Report 2026-09-07 05:24:55 +03:00
Lauri Ojansivu eff1f2092e Add accessible HTML4 Rules Report 2026-09-07 05:24:08 +03:00
Lauri Ojansivu 80b92f67b7 Document accessible HTML4 Files Report 2026-09-07 05:17:58 +03:00
Lauri Ojansivu 3d4e377ddf Add accessible HTML4 Files Report 2026-09-07 05:17:36 +03:00
Lauri Ojansivu 8afb3dd054 Document accessible HTML4 Broken Cards Report 2026-09-07 05:07:45 +03:00
Lauri Ojansivu 31f788b456 Add accessible HTML4 Broken Cards Report 2026-09-07 05:07:25 +03:00
Lauri Ojansivu 41feff5c4f Document accessible HTML4 Cards Report 2026-09-07 04:56:13 +03:00
Lauri Ojansivu 5e3e5c16a1 Add accessible HTML4 Cards Report 2026-09-07 04:55:51 +03:00
Lauri Ojansivu 87cd05a2d7 Document accessible HTML4 Boards Report 2026-09-07 04:48:01 +03:00
Lauri Ojansivu 348a6e0e4f Add accessible HTML4 Boards Report 2026-09-07 04:47:30 +03:00
Lauri Ojansivu b879ab0e35 Document accessible HTML4 Recovery Report 2026-09-07 04:39:59 +03:00
Lauri Ojansivu fd62c39f36 Add accessible HTML4 Recovery Report 2026-09-07 04:39:30 +03:00
Lauri Ojansivu fc0dcac60a Document accessible HTML4 Impersonation Report 2026-09-07 04:33:34 +03:00
Lauri Ojansivu 9e098c3a5c Add accessible HTML4 Impersonation Report 2026-09-07 04:32:49 +03:00
Lauri Ojansivu 89c5191aaa Document accessible HTML4 Offices report 2026-09-07 04:24:44 +03:00
Lauri Ojansivu 52f871da9a Add accessible HTML4 Offices report 2026-09-07 04:24:27 +03:00
Lauri Ojansivu c3b8c89020 Document accessible HTML4 problem reports 2026-09-07 04:19:42 +03:00
Lauri Ojansivu 6c1063c13d Add accessible HTML4 problem reports 2026-09-07 04:19:22 +03:00
Lauri Ojansivu 9c6bac00fb Document accessible HTML4 Problems Summary 2026-09-07 04:11:18 +03:00
Lauri Ojansivu 776886ceb8 Add accessible HTML4 Problems Summary 2026-09-07 04:10:42 +03:00
Lauri Ojansivu ed50553fe0 Document accessible parameterized rules builder 2026-09-07 03:52:16 +03:00
Lauri Ojansivu ac21ba5343 Add accessible parameterized rules builder 2026-09-07 03:51:55 +03:00
Lauri Ojansivu 8357749b4e Document accessible external rules import 2026-09-07 03:34:44 +03:00
Lauri Ojansivu ba2bb4af53 Add accessible external rules import 2026-09-07 03:34:26 +03:00
Lauri Ojansivu 8d504d3fb3 Document accessible HTML4 rules import 2026-09-07 03:30:01 +03:00
Lauri Ojansivu 31dc055d4e Add safe accessible HTML4 rules import 2026-09-07 03:29:19 +03:00
Lauri Ojansivu 7231175d18 Document accessible HTML4 rules export 2026-09-07 03:17:11 +03:00
Lauri Ojansivu c44f647e16 Add accessible HTML4 rules export 2026-09-07 03:16:51 +03:00
Lauri Ojansivu 48256456fc Document accessible HTML4 rules workflow 2026-09-07 03:09:49 +03:00
Lauri Ojansivu 9ec04d7401 Add accessible HTML4 rules workflow 2026-09-07 03:09:33 +03:00
Lauri Ojansivu d577a02335 Document accessible HTML4 board rules 2026-09-07 03:00:30 +03:00
Lauri Ojansivu dab13dd201 Add accessible HTML4 board rules 2026-09-07 02:59:23 +03:00
Lauri Ojansivu e9e0ed684d Document accessible HTML4 broken cards view 2026-09-07 02:47:46 +03:00
Lauri Ojansivu d0b25640bb Add accessible HTML4 broken cards view 2026-09-07 02:47:03 +03:00
Lauri Ojansivu 3956315640 Document accessible HTML4 advanced global search 2026-09-07 02:38:43 +03:00
Lauri Ojansivu e3b9b9fbd1 Add accessible HTML4 advanced global search 2026-09-07 02:38:14 +03:00
Lauri Ojansivu 9027686833 Document accessible HTML4 card activity history 2026-09-07 02:16:56 +03:00
Lauri Ojansivu 4d8af26618 Add accessible HTML4 card activity history 2026-09-07 02:16:42 +03:00
Lauri Ojansivu 8b816ff3fd Document accessible HTML4 subtask controls 2026-09-07 02:08:00 +03:00
Lauri Ojansivu ad03665bc2 Add accessible HTML4 subtask controls 2026-09-07 02:07:28 +03:00
Lauri Ojansivu a204764a9d Document accessible HTML4 card parent controls 2026-09-07 01:51:45 +03:00
Lauri Ojansivu 8ab9fd4bcb Add accessible HTML4 card parent controls 2026-09-07 01:50:46 +03:00
Lauri Ojansivu 7da6e46abe Document accessible HTML4 card watching 2026-09-07 01:24:43 +03:00
Lauri Ojansivu e86b98bcc0 Add accessible HTML4 card watching 2026-09-07 01:24:29 +03:00
Lauri Ojansivu dd15d47e66 Document accessible HTML4 card completion and time 2026-09-07 01:18:28 +03:00
Lauri Ojansivu b60a4649cb Add accessible HTML4 card completion and time 2026-09-07 01:18:04 +03:00
Lauri Ojansivu 82f5ec427a Document accessible HTML4 planning poker 2026-09-07 01:09:04 +03:00
Lauri Ojansivu 3e33ce50a0 Add accessible HTML4 planning poker 2026-09-07 01:07:59 +03:00
Lauri Ojansivu fe31cefa33 Document accessible HTML4 card voting 2026-09-07 00:53:05 +03:00
Lauri Ojansivu 1385564192 Add accessible HTML4 card voting 2026-09-07 00:52:46 +03:00
Lauri Ojansivu d82e0cb0e8 Document accessible HTML4 card dependencies 2026-09-07 00:41:51 +03:00
Lauri Ojansivu cd1c16bfba Add accessible HTML4 card dependencies 2026-09-07 00:41:39 +03:00
Lauri Ojansivu f0c15972ca Document accessible HTML4 card custom fields 2026-09-07 00:33:27 +03:00
Lauri Ojansivu e7dd62f21d Add accessible HTML4 card custom fields 2026-09-07 00:33:04 +03:00
Lauri Ojansivu 4f3765327e Document accessible HTML4 card stickers 2026-09-07 00:20:56 +03:00
Lauri Ojansivu ac4a3b03f7 Add accessible HTML4 card stickers 2026-09-07 00:20:39 +03:00
Lauri Ojansivu 93c87ece66 Document accessible HTML4 card locations 2026-09-07 00:15:30 +03:00
Lauri Ojansivu 93ef25a8dc Add accessible HTML4 card locations 2026-09-07 00:15:13 +03:00
Lauri Ojansivu 649aa1ebf6 Document accessible HTML4 card sorting 2026-09-07 00:08:18 +03:00
Lauri Ojansivu 6611463241 Add accessible HTML4 card sort control 2026-09-07 00:07:52 +03:00
Lauri Ojansivu 2148f53f50 Update Upcoming changelog for HTML4 card identities 2026-09-07 00:03:01 +03:00
Lauri Ojansivu 1325706142 Add accessible HTML4 card identity controls 2026-09-07 00:02:25 +03:00
Lauri Ojansivu 300dfd7b9c Update Upcoming changelog for HTML4 card people 2026-09-06 23:57:16 +03:00
Lauri Ojansivu d781c6e12f Add accessible HTML4 card people controls 2026-09-06 23:56:59 +03:00
Lauri Ojansivu 87bab7d20d Update Upcoming changelog for HTML4 card labels 2026-09-06 23:50:28 +03:00
Lauri Ojansivu 2ce1f6cb58 Add accessible HTML4 card label controls 2026-09-06 23:50:13 +03:00
Lauri Ojansivu f91d751efd Update Upcoming changelog for HTML4 card color 2026-09-06 23:46:36 +03:00
Lauri Ojansivu e365ed0fc0 Add accessible HTML4 card color control 2026-09-06 23:46:19 +03:00
Lauri Ojansivu aa7f42bc80 Update Upcoming changelog for HTML4 card dates 2026-09-06 23:43:04 +03:00
Lauri Ojansivu ee74bc83bd Add accessible HTML4 card date controls 2026-09-06 23:42:49 +03:00
Lauri Ojansivu 971f4eb993 Update Upcoming changelog for HTML4 board deletion 2026-09-06 23:35:14 +03:00
Lauri Ojansivu ed99bb88e0 Add accessible HTML4 permanent board deletion 2026-09-06 23:34:49 +03:00
Lauri Ojansivu ae009e9b12 Update Upcoming changelog for HTML4 Workspaces 2026-09-06 23:24:36 +03:00
Lauri Ojansivu 727bedc92c Add accessible HTML4 workspace assignment 2026-09-06 23:24:15 +03:00
Lauri Ojansivu ff1d67907f Update Upcoming changelog for HTML4 board lifecycle 2026-09-06 23:15:04 +03:00
Lauri Ojansivu a026b12a14 Add accessible HTML4 board creation and copy 2026-09-06 23:14:39 +03:00
Lauri Ojansivu d6b851c6a2 Update Upcoming changelog for HTML4 All Boards actions 2026-09-06 22:57:39 +03:00
Lauri Ojansivu ee5300e38f Add accessible HTML4 All Boards actions 2026-09-06 22:57:19 +03:00
Lauri Ojansivu 4fd4550213 Update Upcoming changelog for HTML4 attachment operations 2026-09-06 22:44:20 +03:00
Lauri Ojansivu 02be8e71af Add shared HTML4 attachment operations 2026-09-06 22:43:51 +03:00
Lauri Ojansivu 9f69283187 Update Upcoming changelog for HTML4 attachments 2026-09-06 22:26:09 +03:00
Lauri Ojansivu c6ca536750 Add secure HTML4 attachment responses 2026-09-06 22:24:47 +03:00
Lauri Ojansivu 859f290029 Update Upcoming changelog for checklist transfers 2026-09-06 22:09:18 +03:00
Lauri Ojansivu c8dbb528ec Add accessible checklist import and export 2026-09-06 22:08:40 +03:00
Lauri Ojansivu 7c95f4c000 Complete checklist-scoped import and export 2026-09-06 21:46:37 +03:00
Lauri Ojansivu db082906f8 Update Upcoming changelog for item conversion 2026-09-06 21:38:23 +03:00
Lauri Ojansivu 5791df505e Add accessible checklist item conversion 2026-09-06 21:37:59 +03:00
Lauri Ojansivu a4963f695e Update Upcoming changelog for checklist moves 2026-09-06 21:21:25 +03:00
Lauri Ojansivu b66ced92cb Add accessible checklist copy and move 2026-09-06 21:21:08 +03:00
Lauri Ojansivu a548401f3c Update Upcoming changelog for HTML4 checklists 2026-09-06 21:14:42 +03:00
Lauri Ojansivu b5bf9ac1d8 Add accessible HTML4 checklist controls 2026-09-06 21:14:10 +03:00
Lauri Ojansivu 34d95cc7d0 Update Upcoming changelog for HTML4 reactions 2026-09-06 21:00:08 +03:00
Lauri Ojansivu 5e111332e9 Update shared UI regression guards 2026-09-06 20:58:03 +03:00
Lauri Ojansivu c8e9c40ac3 Add accessible HTML4 comment reactions 2026-09-06 20:57:34 +03:00
Lauri Ojansivu 74156b09a0 Update Upcoming changelog for HTML4 comment replies 2026-09-06 20:45:35 +03:00
Lauri Ojansivu d7022c0093 Add accessible HTML4 comment replies
Expose explicit parent text and a two-step signed Reply form with unique labels in cookieless HTML4. Reuse the bounded common comment service, reject foreign parents, preserve activity history, and compare the same threaded card in both renderers.
2026-09-06 20:45:15 +03:00
Lauri Ojansivu c83d1ab6aa Update Upcoming changelog for HTML4 comments 2026-09-06 20:41:51 +03:00
Lauri Ojansivu bcbe45abf4 Add accessible HTML4 card comment controls
Share bounded, card-scoped comment creation, editing and deletion between Meteor and cookieless HTML4. Enforce assigned-board and author/admin policy, report boundary probes, preserve activity history, and require a signed two-step delete confirmation.
2026-09-06 20:41:30 +03:00
Lauri Ojansivu 7026c96d3e Update Upcoming changelog for HTML4 card list moves 2026-09-06 20:33:22 +03:00
Lauri Ojansivu 8443789ad3 Add accessible HTML4 card list movement
Add a shared labelled select component and an authoritative card placement operation used by Meteor and cookieless HTML4. Reject foreign or archived destinations, compute ordering server-side, and verify list movement and refusal at the same card URL.
2026-09-06 20:33:04 +03:00
Lauri Ojansivu dacda08dc0 Update Upcoming changelog for HTML4 card editing 2026-09-06 20:29:10 +03:00
Lauri Ojansivu 47580e292e Add accessible HTML4 card editing and archive controls
Share authorized title, description, archive and restore operations between Meteor and signed cookieless HTML4 forms. Validate linked targets and descendant trees before writes, report refused cross-board attempts with actor details, and verify both views at the same card URL.
2026-09-06 20:28:52 +03:00
Lauri Ojansivu 1c6f6fe9e3 Update Upcoming changelog for HTML4 card controls 2026-09-06 20:21:07 +03:00
Lauri Ojansivu d1cf961781 Add accessible HTML4 card creation and ordering
Share authorized card creation and deterministic up/down ordering between Meteor and signed cookieless HTML4 forms. Keep controls labelled and keyboard ordered, reject forged cross-board placement, and cover both representations with same-route browser screenshots.
2026-09-06 20:20:26 +03:00
Lauri Ojansivu b8f751e785 Update changelog for HTML4 WeKan ZIP imports 2026-09-06 20:11:41 +03:00
Lauri Ojansivu 034d3b9208 Add Legacy HTML4 WeKan ZIP imports
Read whole-board and scoped archives through one bounded path-safe service, stream attachment bytes through the standard Default Storage hook, and preserve stable attachment ids in ZIP exports. Add the signed HTML4 ZIP upload, fix Meteor-Files 3 Promise handling, and verify valid and traversing archives in a cookieless browser.
2026-09-06 20:11:20 +03:00
Lauri Ojansivu da81597df0 Update changelog for HTML4 Trello ZIP imports 2026-09-06 19:55:58 +03:00
Lauri Ojansivu 600ee4b027 Add Legacy HTML4 Trello ZIP imports
Expose a separate signed ZIP upload form and reuse the existing guarded Trello package importer after cookieless session validation. Preserve request attribution, enforce the global import switch on both HTML4 and HTTP Trello imports, and verify a real archive creates a board.
2026-09-06 19:55:41 +03:00
Lauri Ojansivu 0f877da5a7 Update changelog for HTML4 file imports 2026-09-06 19:51:04 +03:00
Lauri Ojansivu 78fc4794d1 Add HTML4 JSON and Excel file imports
Stream bounded multipart uploads into private temporary files, validate the signed cookieless form before importing, and remove every temporary file after use. Reuse the normal sanitized board importer for both JSON and Excel uploads and cover both formats with browser tests.
2026-09-06 19:50:35 +03:00
Lauri Ojansivu 05759b3ac4 Update WeKan changelog for HTML4 text imports 2026-09-06 19:41:44 +03:00
Lauri Ojansivu e6892e9a6e Add signed HTML4 text board imports
Provide the shared textarea component and use it for bounded JSON and CSV imports without JavaScript or cookies. Execute the existing authenticated, sanitized, deadline-bound importBoard method, retain safe correction feedback, and link the successfully created board. Cover malformed JSON and a complete CSV import in Chromium.
2026-09-06 19:41:31 +03:00
Lauri Ojansivu 710f510da5 Update WeKan changelog for HTML4 import parts 2026-09-06 19:36:49 +03:00
Lauri Ojansivu 639bff013a Add signed HTML4 import part controls
Render every shared board export field as a semantic import toggle. Carry the validated selection through one-use signed POST forms, preserve an explicit empty selection, ignore forged fields, and verify the controls against the HTML5 Trello import view.
2026-09-06 19:36:37 +03:00
Lauri Ojansivu 40e2e31cbf Update WeKan changelog for HTML4 import picker 2026-09-06 19:33:42 +03:00
Lauri Ojansivu ca008534fa Add shared HTML4 import source picker
Move the ordered import formats into one registry consumed by both renderers. Give cookieless clients a signed, keyboard-accessible source picker at the existing import URLs, retain branded WeKan naming, and compare the Trello picker in same-URL screenshots.
2026-09-06 19:33:30 +03:00
Lauri Ojansivu f7eee822a7 Update WeKan changelog for HTML4 board sections 2026-09-06 19:30:41 +03:00
Lauri Ojansivu 2dcffed269 Match HTML4 All Boards sections
Apply the shared Starred, Remaining, Home, Templates, Archive, and nested Workspace selection rules to cookieless All Boards routes. Render every section and workspace as a signed POST control, preserve board visibility boundaries, and compare the Templates route in both renderers.
2026-09-06 19:30:27 +03:00
Lauri Ojansivu 430623c109 Update WeKan changelog for HTML4 card children 2026-09-06 19:24:05 +03:00
Lauri Ojansivu 8883cace28 Add HTML4 card child collections
Show checklist items, sanitized attachment metadata, and comments in the semantic card table after the parent card passes the board and assigned-only authorization scopes. Keep every child query tied to both the card and board identifiers, and cover successful rendering plus cross-board non-disclosure in the browser test.
2026-09-06 19:23:50 +03:00
Lauri Ojansivu ac65ea7ad9 Update changelog for HTML4 card details
Document the card fields, repeated authorization scopes, same-URL browser comparison, and navigation-label correction.\n\nThanks to xet7 !
2026-09-06 19:20:24 +03:00
Lauri Ojansivu 20b9e25331 Add semantic HTML4 card details
Render the opened card's path, description, labels, people, archive state, and dates at its existing URL. Repeat board visibility and assigned-only card scopes before reading child identities, add complete translated navigation labels, and compare the same card in JavaScript and no-JavaScript Playwright contexts.\n\nThanks to xet7 !
2026-09-06 19:20:07 +03:00
Lauri Ojansivu a815def161 Update changelog for HTML4 card discovery
Document the authenticated readers, signed search form, authorization boundaries, remaining advanced-query work, and no-JavaScript browser coverage.\n\nThanks to xet7 !
2026-09-06 19:14:57 +03:00
Lauri Ojansivu dad6c5b3af Add HTML4 card discovery pages
Render My Cards, Due Cards, Bookmarks, and basic Global Search through authenticated server-side controllers. Scope cards to the user's boards, preserve membership filters, add a labelled signed search form, and keep bookmark URLs sanitized by the shared model. Test cookieless navigation, search, due dates, bookmarks, and private-board exclusion in a real no-JavaScript browser.\n\nThanks to xet7 !
2026-09-06 19:14:42 +03:00
Lauri Ojansivu a4f87d9947 Update changelog for HTML4 information pages
Document the dedicated settings-backed readers, shared shortcuts, progressive enhancement rationale, and same-URL browser coverage.\n\nThanks to xet7 !
2026-09-06 19:10:18 +03:00
Lauri Ojansivu ec6d1aa994 Add HTML4 information page controllers
Render Accessibility, Support, and Keyboard Shortcuts from their existing settings and translation data. Share shortcut mappings between Jade and HTML4, preserve authorization boundaries, document why the complete baseline is not confined to noscript, and track controller coverage. Add source and same-URL Playwright regression tests.\n\nThanks to xet7 !
2026-09-06 19:10:04 +03:00
Lauri Ojansivu d39fb6091f Update upcoming changelog for HTML4 components
Document the shared semantic component registry, browser compatibility baseline, live comparison, cached GIF repair, and regression coverage.\n\nThanks to xet7 !
2026-09-06 19:04:11 +03:00
Lauri Ojansivu 0b48906be5 Add shared HTML4 component library
Define common semantic controls with printable ASCII fallbacks, document the IBrowse, NetSurf and Dillo baseline, expose matching component galleries, and use the registry for swimlane and server-rendered controls. Preserve accessible table structure and board colors, and repair missing cached login-logo GIF files on demand. Add regression coverage for the shared routes, icons, markup and keyboard order.\n\nThanks to xet7 !
2026-09-06 19:03:37 +03:00
Lauri Ojansivu b2ab80643b CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-06 18:35:36 +03:00
Lauri Ojansivu e9ac0cf343 Document HTML4 translation key fix 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 0be47674c1 Reuse existing translations in HTML4 pages 2026-09-06 18:35:33 +03:00
Lauri Ojansivu b6466c1939 Document semantic HTML4 page controllers 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 50ae1d6e12 Add semantic HTML4 page controllers 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 65d68e607d Document cookieless HTML4 sign-up 2026-09-06 18:35:33 +03:00
Lauri Ojansivu d7bfb0afa2 Make Legacy HTML4 sign-up cookieless 2026-09-06 18:35:33 +03:00
Lauri Ojansivu f89d1e32db Document cookieless HTML4 sign-in 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 2298656793 Make Legacy HTML4 login cookieless 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 8f4440380c Document shared ZIP readers 2026-09-06 18:35:33 +03:00
Lauri Ojansivu cda021ba21 Share the server ZIP reader with Trello imports 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 0afb9ca855 Document lazy browser feature loading 2026-09-06 18:35:33 +03:00
Lauri Ojansivu d1b262d29a Lazy-load browser export code 2026-09-06 18:35:33 +03:00
Lauri Ojansivu b8d62f9eff Group image changes in the upcoming changelog 2026-09-06 18:35:33 +03:00
Lauri Ojansivu eb0f0fb265 Document searchable document previews 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 818b57421f Generate searchable document previews on the server 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 7919850d3a Document local image storage 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 1b9080bad8 Store branding and board background images locally 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 67c286b698 Document Legacy HTML4 sign-in parity 2026-09-06 18:35:33 +03:00
Lauri Ojansivu f468c9b9a1 Match Legacy HTML4 sign-in branding
Render the sign-in page from the same product, logo, legal-notice, account-option and translation settings as the HTML5 view. Convert the configured or built-in login logo to a server-side GIF system asset and persist it in Default Storage.
2026-09-06 18:35:33 +03:00
Lauri Ojansivu a2d30bf53b Rename compatibility mode to Legacy HTML4
Remove the former prototype name from WeKan code, routes, stored GIF version metadata, tests, build comments and documentation. Explain on the sign-in page that the Legacy HTML4 view is active because JavaScript drag and drop is unavailable.
2026-09-06 18:35:33 +03:00
Lauri Ojansivu 2af3bf5e88 Document resilient Legacy Omi GIF loading 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 46ecd9dfed Load Legacy Omi image converter lazily
Resolve Sharp through Node only when an authorized Omi image request needs conversion. A missing or incorrectly bundled native addon can no longer crash WeKan or replace the HTML4 sign-in page with Meteor's application error.
2026-09-06 18:35:33 +03:00
Lauri Ojansivu f391b3523a Document Legacy Omi HTML4 baseline 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 98dfb14527 Add progressive Legacy Omi baseline
Serve an HTML 4.01 baseline at every WeKan page URL and upgrade to the Meteor client only after behavioral JavaScript and drag-and-drop capability checks pass. Convert Omi attachment images to stored GIF versions on the server using the configured default attachment storage.
2026-09-06 18:35:33 +03:00
Lauri Ojansivu 7652c79fab Design progressive HTML4 compatibility mode 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 36846fd9d8 Align accessibility test with field tab order 2026-09-06 18:35:33 +03:00
Lauri Ojansivu a90b34c062 Update Upcoming WeKan changelog 2026-09-06 18:35:33 +03:00
Lauri Ojansivu a21acd2d93 Align browser tests with shared table UI 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 9fb3d91d95 Fix authentication form keyboard navigation 2026-09-06 18:35:33 +03:00
Lauri Ojansivu 9161c20b39 Document Admin Panel email configuration 2026-09-06 18:35:33 +03:00
Lauri Ojansivu c3a8d1931e Update UI regression expectations 2026-09-06 18:35:33 +03:00
Lauri Ojansivu d5e89d1e55 Document Meteor test bundle fix 2026-09-06 18:35:33 +03:00
Lauri Ojansivu e80c92f1e2 Fix Meteor client test bundle 2026-09-06 18:35:32 +03:00
github-actions[bot] 6733483702 Bump versions for v11.54 2026-09-06 08:39:59 +00:00
Lauri Ojansivu 7718ee6e36 Prepare v11.54 release 2026-09-06 11:38:46 +03:00
Lauri Ojansivu 7d4962187e Update upcoming Board Rules summary 2026-09-06 11:38:06 +03:00
Lauri Ojansivu e54505b7e2 Document localized rule details 2026-09-06 11:35:59 +03:00
Lauri Ojansivu aef1f02fe0 Localize stored rule descriptions 2026-09-06 11:35:36 +03:00
Lauri Ojansivu e1bda48205 Document themed Board Rules toolbar 2026-09-06 11:29:38 +03:00
Lauri Ojansivu a20728ed72 Theme board rules toolbar actions 2026-09-06 11:29:22 +03:00
Lauri Ojansivu 648d1941aa Document square top Add Board button 2026-09-06 11:26:05 +03:00
Lauri Ojansivu 8af89a687a Keep top Add Board button square 2026-09-06 11:25:48 +03:00
Lauri Ojansivu de68a9453f Document card title color inheritance 2026-09-06 11:23:47 +03:00
Lauri Ojansivu ebb35af50d Match card chrome to title color 2026-09-06 11:23:31 +03:00
Lauri Ojansivu a8369e5cd0 Document swimlane control colors 2026-09-06 11:17:16 +03:00
Lauri Ojansivu fa8c3959c7 Match swimlane controls to title color 2026-09-06 11:16:55 +03:00
Lauri Ojansivu d353a9ee4a Document global translation completeness gate 2026-09-06 11:12:54 +03:00
Lauri Ojansivu 6cae1d48b9 Enforce translation completeness globally 2026-09-06 11:12:13 +03:00
Lauri Ojansivu 77c7f34c8e Document retired translation backlog 2026-09-06 11:09:19 +03:00
Lauri Ojansivu 6c37b7c779 Retire completed translation backlog 2026-09-06 11:08:58 +03:00
Lauri Ojansivu 810d92b21b Document completed translations 2026-09-06 11:07:36 +03:00
Lauri Ojansivu f2880c4e6d Complete all remaining translations 2026-09-06 11:06:30 +03:00
Lauri Ojansivu cf042ef24f Document compact All Boards table controls 2026-09-06 11:05:55 +03:00
Lauri Ojansivu 438477c929 Compact All Boards table controls 2026-09-06 11:05:35 +03:00
Lauri Ojansivu 1fdfa00b74 Update changelog for Offices history 2026-09-06 10:58:59 +03:00
Lauri Ojansivu c5d32a5cc0 Restore legacy Offices login history 2026-09-06 10:58:43 +03:00
Lauri Ojansivu f63262be1c Group Admin Panel changelog fixes 2026-09-06 10:57:01 +03:00
Lauri Ojansivu 434847ac36 Update changelog for Boards Report filter 2026-09-06 10:56:42 +03:00
Lauri Ojansivu cde94d0b14 Filter Boards Report by permission 2026-09-06 10:56:27 +03:00
Lauri Ojansivu ebbb526894 Update changelog for attachment deletion audit 2026-09-06 10:50:14 +03:00
Lauri Ojansivu 99b1801e84 Gate and audit Files Report permanent deletion 2026-09-06 10:50:01 +03:00
Lauri Ojansivu a1a2e2d3df Update changelog for Files Report previews 2026-09-06 10:45:49 +03:00
Lauri Ojansivu 2248c012c8 Add card-style previews to Files Report 2026-09-06 10:45:35 +03:00
Lauri Ojansivu 925f623c55 Update changelog for Admin Panel user cells 2026-09-06 10:35:35 +03:00
Lauri Ojansivu 37b7eb06aa Show wrapping names in Admin Panel user cells 2026-09-06 10:35:23 +03:00
Lauri Ojansivu d94d433c64 Update changelog for Problems origin context 2026-09-06 10:30:50 +03:00
Lauri Ojansivu fa68600bb5 Show origin context in all Problems event reports 2026-09-06 10:30:27 +03:00
Lauri Ojansivu 2019c2f547 Update Tswana export translation progress 2026-09-06 10:12:27 +03:00
Lauri Ojansivu 9c2fbdd14f Translate Tswana card export and filters 2026-09-06 10:12:11 +03:00
Lauri Ojansivu 3ef8984792 Update Tswana validation translation progress 2026-09-06 10:11:19 +03:00
Lauri Ojansivu 0a8cfa096d Translate Tswana account email and validation 2026-09-06 10:11:00 +03:00
Lauri Ojansivu 5bc3acacd4 Update Tswana custom field translation progress 2026-09-06 10:09:48 +03:00
Lauri Ojansivu 27f2f26aa8 Translate Tswana permissions and custom fields 2026-09-06 10:09:31 +03:00
Lauri Ojansivu 66f84bac12 Update Tswana color translation progress 2026-09-06 10:08:39 +03:00
Lauri Ojansivu 32e0b5da7e Translate Tswana navigation and colors 2026-09-06 10:08:06 +03:00
Lauri Ojansivu 76524969fe Update Tswana appearance translation progress 2026-09-06 10:06:57 +03:00
Lauri Ojansivu a20099e25d Translate Tswana member mapping and appearance 2026-09-06 10:06:38 +03:00
Lauri Ojansivu cd7b62d199 Update Tswana card dialog translation progress 2026-09-06 10:05:27 +03:00
Lauri Ojansivu 06bfed394b Translate Tswana card dialogs and voting 2026-09-06 10:05:09 +03:00
Lauri Ojansivu da232621f6 Update Tswana board view translation progress 2026-09-06 10:04:27 +03:00
Lauri Ojansivu 73107aee32 Translate Tswana board views and archives 2026-09-06 10:03:44 +03:00
Lauri Ojansivu c761184ab1 Update Tswana board display progress 2026-09-06 10:02:48 +03:00
Lauri Ojansivu cf879f7011 Translate Tswana archive and board display settings 2026-09-06 10:02:28 +03:00
Lauri Ojansivu 6d30f128ed Update Tswana board sizing progress 2026-09-06 10:01:43 +03:00
Lauri Ojansivu 7965f8561d Translate Tswana board sizing controls 2026-09-06 10:01:04 +03:00
Lauri Ojansivu bd5a45b49b Update Tswana workspace translation progress 2026-09-06 10:00:03 +03:00
Lauri Ojansivu 426d051e63 Translate Tswana activity and workspaces 2026-09-06 09:59:45 +03:00
Lauri Ojansivu a1d44b4930 Start Tswana translation progress 2026-09-06 09:58:38 +03:00
Lauri Ojansivu 83b3c18dd4 Translate Tswana board activity basics 2026-09-06 09:58:13 +03:00
Lauri Ojansivu 568e695b6b Mark Tigre translations complete 2026-09-06 09:56:47 +03:00
Lauri Ojansivu c8fefb4b70 Complete Tigre translations 2026-09-06 09:56:05 +03:00
Lauri Ojansivu 30aba37f82 Update Tigre repair translation progress 2026-09-06 09:54:44 +03:00
Lauri Ojansivu d9415ea5ae Translate Tigre repository and repair status 2026-09-06 09:54:25 +03:00
Lauri Ojansivu 3b98d05b14 Update Tigre migration scheduling progress 2026-09-06 09:53:29 +03:00
Lauri Ojansivu 0217715b9f Translate Tigre migration scheduling controls 2026-09-06 09:52:58 +03:00
Lauri Ojansivu 3238e83a59 Update Tigre migration metrics progress 2026-09-06 09:51:54 +03:00
Lauri Ojansivu 588aa1308b Translate Tigre migration steps and metrics 2026-09-06 09:51:38 +03:00
Lauri Ojansivu 517df93b2c Update Tigre board migration progress 2026-09-06 09:50:35 +03:00
Lauri Ojansivu a9961480bb Translate Tigre board integrity migrations 2026-09-06 09:50:08 +03:00
Lauri Ojansivu 8102239888 Update Tigre storage migration progress 2026-09-06 09:48:35 +03:00
Lauri Ojansivu 68c542b063 Translate Tigre storage migration controls 2026-09-06 09:48:19 +03:00
Lauri Ojansivu da7cfc8686 Update Tigre cloud backup translation progress 2026-09-06 09:47:16 +03:00
Lauri Ojansivu c0cdbf8fe4 Translate Tigre cloud backup settings 2026-09-06 09:47:01 +03:00
Lauri Ojansivu 3c139ff53a Update Tigre data safety translation progress 2026-09-06 09:45:37 +03:00
Lauri Ojansivu d05c3eb2ce Translate Tigre data safety controls 2026-09-06 09:44:58 +03:00
Lauri Ojansivu 591c7f7768 Update Tigre migration translation progress 2026-09-06 09:42:07 +03:00
Lauri Ojansivu 51efa53804 Translate Tigre scheduled migrations and storage 2026-09-06 09:41:54 +03:00
Lauri Ojansivu f18498940c Update Tigre login protection translation progress 2026-09-06 09:40:41 +03:00
Lauri Ojansivu 791154c2c4 Translate Tigre accessibility and login protection 2026-09-06 09:40:24 +03:00
Lauri Ojansivu e92d25f915 Update Tigre support translation progress 2026-09-06 09:39:17 +03:00
Lauri Ojansivu 24091262a3 Translate Tigre board status and support settings 2026-09-06 09:38:58 +03:00
Lauri Ojansivu 2cb2e9508d Update Tigre storage translation progress 2026-09-06 09:37:27 +03:00
Lauri Ojansivu 0a7185eac0 Translate Tigre attachment storage maintenance 2026-09-06 09:37:13 +03:00
Lauri Ojansivu 4fd7fa3270 Update Tigre checklist translation progress 2026-09-06 09:35:58 +03:00
Lauri Ojansivu cb54eb4c32 Translate Tigre teams and checklist actions 2026-09-06 09:35:44 +03:00
Lauri Ojansivu b315ee508a Update Tigre recovery translation progress 2026-09-06 09:34:27 +03:00
Lauri Ojansivu 6e24714b27 Translate Tigre recovery and ticket reports 2026-09-06 09:34:13 +03:00
Lauri Ojansivu 659788e787 Update Tigre report translation progress 2026-09-06 09:33:04 +03:00
Lauri Ojansivu 5c88a759fe Translate Tigre maps and problem reports 2026-09-06 09:32:45 +03:00
Lauri Ojansivu 107e33e430 Update Tigre dependency translation progress 2026-09-06 09:31:35 +03:00
Lauri Ojansivu edcd387724 Translate Tigre dependencies and backgrounds 2026-09-06 09:31:15 +03:00
Lauri Ojansivu c8aa6ca10d Update Tigre search guide translation progress 2026-09-06 09:29:49 +03:00
Lauri Ojansivu 9de47e1be3 Translate Tigre search instructions 2026-09-06 09:29:33 +03:00
Lauri Ojansivu e3b705729a Update Tigre search translation progress 2026-09-06 09:27:59 +03:00
Lauri Ojansivu 4bbb0aa38f Translate Tigre search operators 2026-09-06 09:27:42 +03:00
Lauri Ojansivu 66c67f77d1 Update Tigre shared views translation progress 2026-09-06 09:26:57 +03:00
Lauri Ojansivu 9573cd6670 Translate Tigre shared views and search 2026-09-06 09:26:39 +03:00
Lauri Ojansivu 315ece9da1 Update Tigre roles translation progress 2026-09-06 09:25:14 +03:00
Lauri Ojansivu 70fed7d8a8 Translate Tigre roles and editor settings 2026-09-06 09:24:55 +03:00
Lauri Ojansivu a238b765aa Update Tigre due date translation progress 2026-09-06 09:23:30 +03:00
Lauri Ojansivu d8fb8f5ce6 Translate Tigre account and due date settings 2026-09-06 09:23:16 +03:00
Lauri Ojansivu 1b6fa9d81b Update Tigre site settings translation progress 2026-09-06 09:22:05 +03:00
Lauri Ojansivu c140f4d861 Translate Tigre rule details and site settings 2026-09-06 09:21:49 +03:00
Lauri Ojansivu 8b86f9b975 Update Tigre automation translation progress 2026-09-06 09:20:48 +03:00
Lauri Ojansivu c152297958 Translate Tigre automation rule actions 2026-09-06 09:20:09 +03:00
Lauri Ojansivu 61149e1432 Update Tigre scheduled automation progress 2026-09-06 09:18:25 +03:00
Lauri Ojansivu 1459dda2db Translate Tigre scheduled automation rules 2026-09-06 09:17:31 +03:00
Lauri Ojansivu d82c0e7fc0 Update Tigre automation rule progress 2026-09-06 09:16:25 +03:00
Lauri Ojansivu f32cc7bf23 Translate Tigre automation rule basics 2026-09-06 09:16:06 +03:00
Lauri Ojansivu 259bfcac53 Update Tigre card and subtask progress 2026-09-06 09:14:42 +03:00
Lauri Ojansivu 97f966d6e7 Translate Tigre card and subtask settings 2026-09-06 09:14:20 +03:00
Lauri Ojansivu 1f0e4660f3 Update Tigre system and organization progress 2026-09-06 09:12:56 +03:00
Lauri Ojansivu 3be9d1b873 Translate Tigre system and organization settings 2026-09-06 09:12:35 +03:00
Lauri Ojansivu 76fecb7b2a Update Tigre limits and webhook progress 2026-09-06 09:10:28 +03:00
Lauri Ojansivu ecba7527ae Translate Tigre limits and webhooks 2026-09-06 09:10:10 +03:00
Lauri Ojansivu 92bab0aaae Update Tigre tracking and branding progress 2026-09-06 09:07:55 +03:00
Lauri Ojansivu 5baa94b076 Translate Tigre tracking and branding settings 2026-09-06 09:07:37 +03:00
Lauri Ojansivu 50f3580d68 Update Tigre access and shortcut progress 2026-09-06 09:06:02 +03:00
Lauri Ojansivu 30087db9d1 Translate Tigre access and shortcut controls 2026-09-06 09:05:42 +03:00
Lauri Ojansivu f6cfd547b5 Update Tigre list and selection progress 2026-09-06 09:03:47 +03:00
Lauri Ojansivu 159495be21 Translate Tigre list and selection controls 2026-09-06 09:03:22 +03:00
Lauri Ojansivu af3bd25fe1 Update Tigre Trello import progress 2026-09-06 09:01:30 +03:00
Lauri Ojansivu 92dc21d535 Translate Tigre Trello import controls 2026-09-06 09:01:02 +03:00
Lauri Ojansivu 8711e712fa Update Tigre advanced filter and import progress 2026-09-06 08:58:57 +03:00
Lauri Ojansivu ce455503de Translate Tigre advanced filters and imports 2026-09-06 08:58:34 +03:00
Lauri Ojansivu 3b4b7d4a84 Update Tigre export and filter progress 2026-09-06 08:55:58 +03:00
Lauri Ojansivu e7c9b9982d Translate Tigre export and filter controls 2026-09-06 08:55:09 +03:00
Lauri Ojansivu 3f87c4f8e0 Update Tigre email and validation progress 2026-09-06 08:53:58 +03:00
Lauri Ojansivu 76ddeaf58c Translate Tigre email and validation messages 2026-09-06 08:53:38 +03:00
Lauri Ojansivu e39093e677 Update Tigre roles and custom field progress 2026-09-06 08:52:02 +03:00
Lauri Ojansivu 42af574e2e Translate Tigre roles and custom fields 2026-09-06 08:51:22 +03:00
Lauri Ojansivu 55cc5d7913 Update Tigre navigation and color progress 2026-09-06 08:50:10 +03:00
Lauri Ojansivu d6662e77be Translate Tigre navigation and colors 2026-09-06 08:49:51 +03:00
Lauri Ojansivu 0b0d3af1b8 Update Tigre member and theme progress 2026-09-06 08:48:34 +03:00
Lauri Ojansivu 73ef66b32d Translate Tigre member and theme settings 2026-09-06 08:48:16 +03:00
Lauri Ojansivu 1b70ec9044 Update Tigre voting and import progress 2026-09-06 08:46:59 +03:00
Lauri Ojansivu 7f9ee353ed Translate Tigre voting and import controls 2026-09-06 08:46:42 +03:00
Lauri Ojansivu d7b9101448 Update Tigre board view progress 2026-09-06 08:45:36 +03:00
Lauri Ojansivu 496bc0c11a Translate Tigre board views and archives 2026-09-06 08:45:17 +03:00
Lauri Ojansivu 1f15dd7dc8 Update Tigre archive and board progress 2026-09-06 08:43:59 +03:00
Lauri Ojansivu 6cd1bdb51d Translate Tigre archive and board settings 2026-09-06 08:43:42 +03:00
Lauri Ojansivu 7e0b526fb8 Update Tigre board layout progress 2026-09-06 08:42:26 +03:00
Lauri Ojansivu be650df436 Translate Tigre board layout settings 2026-09-06 08:42:08 +03:00
Lauri Ojansivu 6916c1fb6e Update Tigre activity and workspace progress 2026-09-06 08:40:39 +03:00
Lauri Ojansivu 110b9c0519 Translate Tigre activity and workspace terms 2026-09-06 08:40:23 +03:00
Lauri Ojansivu c275a1a6e3 Record first Tigre translation batch 2026-09-06 08:39:13 +03:00
Lauri Ojansivu 759f1a1730 Start Tigre activity translations 2026-09-06 08:38:43 +03:00
Lauri Ojansivu 77549aeecb Record completed Tigrinya translations 2026-09-06 08:36:06 +03:00
Lauri Ojansivu 52a390a435 Complete Tigrinya translations 2026-09-06 08:35:23 +03:00
Lauri Ojansivu 228eafb36b Update Tigrinya repository and repair progress 2026-09-06 08:33:52 +03:00
Lauri Ojansivu cd06e638dc Translate Tigrinya repository and repair reports 2026-09-06 08:33:35 +03:00
Lauri Ojansivu 7f2e7d848a Update Tigrinya migration job progress 2026-09-06 08:32:21 +03:00
Lauri Ojansivu 820968cc27 Translate Tigrinya migration job controls 2026-09-06 08:32:04 +03:00
Lauri Ojansivu 137d0cbd7c Update Tigrinya migration monitoring progress 2026-09-06 08:31:03 +03:00
Lauri Ojansivu b09c323e83 Translate Tigrinya migration monitoring 2026-09-06 08:30:46 +03:00
Lauri Ojansivu 25a2dd3ba3 Update Tigrinya board migration progress 2026-09-06 08:28:36 +03:00
Lauri Ojansivu b7cfb4bb72 Translate Tigrinya board migration repairs 2026-09-06 08:28:02 +03:00
Lauri Ojansivu bfc000e9cc Update Tigrinya cloud migration progress 2026-09-06 08:25:09 +03:00
Lauri Ojansivu ae98dcada9 Translate Tigrinya cloud migration controls 2026-09-06 08:24:52 +03:00
Lauri Ojansivu 0c4c58bcfb Update Tigrinya backup translation progress 2026-09-06 08:23:31 +03:00
Lauri Ojansivu ac3909d856 Translate Tigrinya backup and cloud storage 2026-09-06 08:23:15 +03:00
Lauri Ojansivu 4fa2b47d2d Update Tigrinya data safety progress 2026-09-06 08:21:24 +03:00
Lauri Ojansivu a66c523a9d Translate Tigrinya data safety settings 2026-09-06 08:20:49 +03:00
Lauri Ojansivu 3c181b45c4 Update Tigrinya migration translation progress 2026-09-06 08:18:03 +03:00
Lauri Ojansivu 77845676cc Translate Tigrinya scheduled migrations 2026-09-06 08:17:27 +03:00
Lauri Ojansivu 99357831e7 Update Tigrinya lockout translation progress 2026-09-06 08:15:48 +03:00
Lauri Ojansivu 5f5d6c5119 Translate Tigrinya accessibility and lockout settings 2026-09-06 08:15:33 +03:00
Lauri Ojansivu 61115e20aa Update Tigrinya support translation progress 2026-09-06 08:14:20 +03:00
Lauri Ojansivu df3a7f3b32 Translate Tigrinya board and support settings 2026-09-06 08:14:03 +03:00
Lauri Ojansivu 182184d713 Update Tigrinya storage translation progress 2026-09-06 08:12:43 +03:00
Lauri Ojansivu 3234e26f12 Translate Tigrinya attachment storage controls 2026-09-06 08:12:27 +03:00
Lauri Ojansivu d238bc8f3d Update Tigrinya checklist translation progress 2026-09-06 08:11:09 +03:00
Lauri Ojansivu a1e4765930 Translate Tigrinya memory and checklist controls 2026-09-06 08:10:49 +03:00
Lauri Ojansivu 1729873f2c Update Tigrinya recovery translation progress 2026-09-06 08:09:20 +03:00
Lauri Ojansivu b4792cef95 Translate Tigrinya recovery and ticket reports 2026-09-06 08:09:03 +03:00
Lauri Ojansivu 42fc98039d Update Tigrinya report translation progress 2026-09-06 08:08:02 +03:00
Lauri Ojansivu cb6acdf6d1 Translate Tigrinya maps and problem reports 2026-09-06 08:07:39 +03:00
Lauri Ojansivu 07a191e4d0 Update Tigrinya dependency translation progress 2026-09-06 08:05:42 +03:00
Lauri Ojansivu 93a643aaaf Translate Tigrinya dependencies and backgrounds 2026-09-06 08:05:23 +03:00
Lauri Ojansivu 63c7c5aa9d Update Tigrinya search instruction progress 2026-09-06 08:04:22 +03:00
Lauri Ojansivu 246305caf0 Translate Tigrinya global search instructions 2026-09-06 08:04:06 +03:00
Lauri Ojansivu b70f9930b4 Update Tigrinya search translation progress 2026-09-06 08:02:09 +03:00
Lauri Ojansivu bc9ca3f859 Translate Tigrinya global search terms 2026-09-06 08:01:53 +03:00
Lauri Ojansivu 70484fc960 Update Tigrinya card view translation progress 2026-09-06 08:00:52 +03:00
Lauri Ojansivu aac61c73ce Translate Tigrinya shared and due card views 2026-09-06 08:00:32 +03:00
Lauri Ojansivu fab1328a20 Update Tigrinya role translation progress 2026-09-06 07:58:57 +03:00
Lauri Ojansivu 5ebfcaecb3 Translate Tigrinya editor and role settings 2026-09-06 07:58:42 +03:00
Lauri Ojansivu b8e27e485a Update Tigrinya date translation progress 2026-09-06 07:57:38 +03:00
Lauri Ojansivu debafc69e6 Translate Tigrinya dates and deletion warnings 2026-09-06 07:57:18 +03:00
Lauri Ojansivu f8407950b1 Update Tigrinya manifest translation progress 2026-09-06 07:55:38 +03:00
Lauri Ojansivu f860decb3b Translate Tigrinya rule details and manifests 2026-09-06 07:54:40 +03:00
Lauri Ojansivu b0609f7124 Update Tigrinya automation action progress 2026-09-06 07:53:40 +03:00
Lauri Ojansivu 0d326f7e13 Translate Tigrinya automation actions 2026-09-06 07:53:18 +03:00
Lauri Ojansivu a8bf202e7e Update Tigrinya scheduled rule progress 2026-09-06 07:52:08 +03:00
Lauri Ojansivu 111be85ddd Translate Tigrinya scheduled automation rules 2026-09-06 07:51:33 +03:00
Lauri Ojansivu 3efb24a5a2 Update Tigrinya automation translation progress 2026-09-06 07:50:36 +03:00
Lauri Ojansivu e0715a37e2 Translate Tigrinya automation rule basics 2026-09-06 07:50:20 +03:00
Lauri Ojansivu 0d98358276 Update Tigrinya subtask translation progress 2026-09-06 07:48:50 +03:00
Lauri Ojansivu 0b8ba08025 Translate Tigrinya card and subtask settings 2026-09-06 07:48:34 +03:00
Lauri Ojansivu f261cc9cb5 Update Tigrinya organization translation progress 2026-09-06 07:47:27 +03:00
Lauri Ojansivu 3b78e4c6ef Translate Tigrinya system and organization settings 2026-09-06 07:47:07 +03:00
Lauri Ojansivu 522997da6c Update Tigrinya webhook translation progress 2026-09-06 07:45:35 +03:00
Lauri Ojansivu f551da0c81 Use Tigrinya term for SMTP port 2026-09-06 07:45:14 +03:00
Lauri Ojansivu 8cfc0c2b6a Translate Tigrinya limits and webhooks 2026-09-06 07:44:50 +03:00
Lauri Ojansivu 2c28b04131 Update Tigrinya branding translation progress 2026-09-06 07:43:43 +03:00
Lauri Ojansivu fd246241d0 Translate Tigrinya tracking and branding 2026-09-06 07:43:28 +03:00
Lauri Ojansivu b801bed64b Update Tigrinya privacy translation progress 2026-09-06 07:42:03 +03:00
Lauri Ojansivu b311837d3c Translate Tigrinya privacy and shortcuts 2026-09-06 07:41:49 +03:00
Lauri Ojansivu 31086ba39f Update Tigrinya selection translation progress 2026-09-06 07:40:35 +03:00
Lauri Ojansivu 55cd75cffa Translate Tigrinya archive and selection controls 2026-09-06 07:40:17 +03:00
Lauri Ojansivu 938453a0d5 Update Tigrinya Trello translation progress 2026-09-06 07:38:53 +03:00
Lauri Ojansivu aab9606a57 Translate Tigrinya Trello import controls 2026-09-06 07:38:37 +03:00
Lauri Ojansivu d5c7f966f0 Update Tigrinya import translation progress 2026-09-06 07:37:23 +03:00
Lauri Ojansivu d8d96b275c Translate Tigrinya filters and imports 2026-09-06 07:36:38 +03:00
Lauri Ojansivu 4a29558146 Update Tigrinya export translation progress 2026-09-06 07:34:37 +03:00
Lauri Ojansivu 1691ceb992 Translate Tigrinya exports and filters 2026-09-06 07:33:56 +03:00
Lauri Ojansivu e9c1c14083 Update Tigrinya translation progress 2026-09-06 07:33:00 +03:00
Lauri Ojansivu 14618261a1 Translate Tigrinya email and error messages 2026-09-06 07:32:37 +03:00
Lauri Ojansivu e77ec382b8 Update Tigrinya custom field translation progress 2026-09-06 07:30:12 +03:00
Lauri Ojansivu c577996d3e Translate Tigrinya roles and custom fields 2026-09-06 07:29:55 +03:00
Lauri Ojansivu e9e98f4e61 Update Tigrinya color translation progress 2026-09-06 07:28:24 +03:00
Lauri Ojansivu c981e04bc7 Translate Tigrinya card aging and colors 2026-09-06 07:28:06 +03:00
Lauri Ojansivu 507d72da64 Update Tigrinya theme translation progress 2026-09-06 07:26:51 +03:00
Lauri Ojansivu 0d0a400983 Translate Tigrinya member mapping and themes 2026-09-06 07:26:10 +03:00
Lauri Ojansivu a73f715150 Update Tigrinya voting translation progress 2026-09-06 07:24:35 +03:00
Lauri Ojansivu 9e1420b15c Translate Tigrinya voting and import dialogs 2026-09-06 07:24:14 +03:00
Lauri Ojansivu 3d8ed7d723 Update Tigrinya board view translation progress 2026-09-06 07:22:41 +03:00
Lauri Ojansivu 3db2aa4c63 Translate Tigrinya board views and card dates 2026-09-06 07:22:20 +03:00
Lauri Ojansivu 8dacc41b1d Update Tigrinya archive translation progress 2026-09-06 07:21:02 +03:00
Lauri Ojansivu 14e601d6ee Translate Tigrinya archives and board settings 2026-09-06 07:20:44 +03:00
Lauri Ojansivu e36cb75579 Update Tigrinya sizing translation progress 2026-09-06 07:19:30 +03:00
Lauri Ojansivu bca47dfc9f Translate Tigrinya workspace and sizing controls 2026-09-06 07:19:09 +03:00
Lauri Ojansivu 5063e0565a Update Tigrinya workspace translation progress 2026-09-06 07:17:23 +03:00
Lauri Ojansivu 8789ab2985 Translate Tigrinya activity and workspace strings 2026-09-06 07:16:49 +03:00
Lauri Ojansivu 79ca4f85bc Record Tajik completion and Tigrinya progress 2026-09-06 07:15:08 +03:00
Lauri Ojansivu c58b4e4bc7 Start Tigrinya activity translations 2026-09-06 07:14:48 +03:00
Lauri Ojansivu 19c469c42f Mark Tajik translations complete 2026-09-06 07:12:45 +03:00
Lauri Ojansivu 35b133cb6d Complete Tajik translations 2026-09-06 07:12:14 +03:00
Lauri Ojansivu c9cc9196cc Translate Tajik repositories and problem repairs 2026-09-06 07:11:16 +03:00
Lauri Ojansivu 6a9f13fc9a Update Tajik migration control translation progress 2026-09-06 07:09:54 +03:00
Lauri Ojansivu d2d7f99883 Translate Tajik migration controls and limits 2026-09-06 07:09:12 +03:00
Lauri Ojansivu 703216e035 Update Tajik migration step translation progress 2026-09-06 07:08:18 +03:00
Lauri Ojansivu 180b257786 Translate Tajik migration steps and monitoring 2026-09-06 07:07:58 +03:00
Lauri Ojansivu c3283f689a Update Tajik board repair translation progress 2026-09-06 07:07:06 +03:00
Lauri Ojansivu f0c999ec63 Translate Tajik board repair migrations 2026-09-06 07:06:46 +03:00
Lauri Ojansivu 77bc78f9ad Update Tajik cloud migration translation progress 2026-09-06 07:05:44 +03:00
Lauri Ojansivu 19f68f485b Translate Tajik cloud migrations and monitoring 2026-09-06 07:05:20 +03:00
Lauri Ojansivu 58d147b029 Update Tajik cloud backup translation progress 2026-09-06 07:04:08 +03:00
Lauri Ojansivu 4d0e6ab0d4 Translate Tajik cloud backup settings 2026-09-06 07:03:20 +03:00
Lauri Ojansivu c39fe5a324 Update Tajik security translation progress 2026-09-06 07:01:46 +03:00
Lauri Ojansivu 9b0edbd71c Translate Tajik security and backup features 2026-09-06 07:01:27 +03:00
Lauri Ojansivu 33b8c78d38 Update Tajik migration translation progress 2026-09-06 07:00:01 +03:00
Lauri Ojansivu ca7eb1e189 Translate Tajik scheduled migrations and storage 2026-09-06 06:59:42 +03:00
Lauri Ojansivu 42e4c3be65 Update Tajik lockout translation progress 2026-09-06 06:58:49 +03:00
Lauri Ojansivu 2be6e58a3c Translate Tajik accessibility and lockout settings 2026-09-06 06:58:30 +03:00
Lauri Ojansivu 9a7642d8d9 Update Tajik support translation progress 2026-09-06 06:57:17 +03:00
Lauri Ojansivu 4b549fbf8f Translate Tajik file and support settings 2026-09-06 06:57:00 +03:00
Lauri Ojansivu 8bff031003 Update Tajik storage translation progress 2026-09-06 06:56:08 +03:00
Lauri Ojansivu d3328d9499 Translate Tajik attachment storage management 2026-09-06 06:55:51 +03:00
Lauri Ojansivu 73d00a6a8b Update Tajik checklist translation progress 2026-09-06 06:55:01 +03:00
Lauri Ojansivu d68aa5abc0 Translate Tajik memory and checklist settings 2026-09-06 06:54:44 +03:00
Lauri Ojansivu 6fd6433bb6 Update Tajik recovery translation progress 2026-09-06 06:53:39 +03:00
Lauri Ojansivu b57294427b Translate Tajik recovery and ticket reports 2026-09-06 06:53:24 +03:00
Lauri Ojansivu ee2dc7c12c Update Tajik report translation progress 2026-09-06 06:52:40 +03:00
Lauri Ojansivu 3c7229ffd4 Translate Tajik locations and admin reports 2026-09-06 06:52:24 +03:00
Lauri Ojansivu d96ee9ab6d Update Tajik dependency translation progress 2026-09-06 06:51:37 +03:00
Lauri Ojansivu 46be6abab7 Translate Tajik dependencies and backgrounds 2026-09-06 06:51:21 +03:00
Lauri Ojansivu 3f60d63ab1 Update Tajik search help translation progress 2026-09-06 06:50:18 +03:00
Lauri Ojansivu bd31fb0737 Translate Tajik global search instructions 2026-09-06 06:50:03 +03:00
Lauri Ojansivu 7c08a0db90 Update Tajik search translation progress 2026-09-06 06:48:53 +03:00
Lauri Ojansivu dbee45246f Translate Tajik search operators and results 2026-09-06 06:48:37 +03:00
Lauri Ojansivu b68e351930 Update Tajik card view translation progress 2026-09-06 06:47:55 +03:00
Lauri Ojansivu f431557ed3 Translate Tajik templates and card views 2026-09-06 06:47:40 +03:00
Lauri Ojansivu 9837b8a6a2 Update Tajik role translation progress 2026-09-06 06:46:37 +03:00
Lauri Ojansivu fdf603db7b Translate Tajik roles and interface preferences 2026-09-06 06:46:16 +03:00
Lauri Ojansivu 77ec83c8b8 Update Tajik reminder translation progress 2026-09-06 06:45:30 +03:00
Lauri Ojansivu 897c96e2e5 Translate Tajik reminders and interface settings 2026-09-06 06:44:57 +03:00
Lauri Ojansivu 69290cbbbb Update Tajik customization translation progress 2026-09-06 06:44:01 +03:00
Lauri Ojansivu c79df975be Translate Tajik rule actions and customization 2026-09-06 06:43:45 +03:00
Lauri Ojansivu cb0ee1244e Update Tajik rule action translation progress 2026-09-06 06:42:40 +03:00
Lauri Ojansivu 947bd129e2 Translate Tajik rule conditions and actions 2026-09-06 06:42:20 +03:00
Lauri Ojansivu b3f37c61b2 Update Tajik automation translation progress 2026-09-06 06:41:37 +03:00
Lauri Ojansivu db55e651e9 Translate Tajik scheduled automation rules 2026-09-06 06:41:20 +03:00
Lauri Ojansivu 109e8ddedf Update Tajik rules translation progress 2026-09-06 06:40:32 +03:00
Lauri Ojansivu ecebda9664 Translate Tajik rules and activities 2026-09-06 06:40:16 +03:00
Lauri Ojansivu 95b88ba39c Update Tajik card translation progress 2026-09-06 06:39:02 +03:00
Lauri Ojansivu 18e45958e9 Translate Tajik cards and subtasks 2026-09-06 06:38:47 +03:00
Lauri Ojansivu e93f079255 Update Tajik organization translation progress 2026-09-06 06:37:59 +03:00
Lauri Ojansivu 83eea7bbcd Translate Tajik system and organization settings 2026-09-06 06:37:39 +03:00
Lauri Ojansivu 4ea68558fd Update Tajik webhook progress 2026-09-06 06:35:59 +03:00
Lauri Ojansivu 77fa9ca829 Translate Tajik transfer limits and webhooks 2026-09-06 06:35:42 +03:00
Lauri Ojansivu 2679a086ce Update Tajik upload progress 2026-09-06 06:34:27 +03:00
Lauri Ojansivu c487639dcb Translate Tajik uploads and templates 2026-09-06 06:34:07 +03:00
Lauri Ojansivu 0f04071d54 Update Tajik shortcut progress 2026-09-06 06:33:02 +03:00
Lauri Ojansivu 65b0124a2c Translate Tajik notifications and shortcuts 2026-09-06 06:32:46 +03:00
Lauri Ojansivu 96d93d5879 Update Tajik role progress 2026-09-06 06:31:38 +03:00
Lauri Ojansivu 6ceb25958d Translate Tajik selection and roles 2026-09-06 06:31:22 +03:00
Lauri Ojansivu 5c9bba0b1d Update Tajik Trello import progress 2026-09-06 06:30:17 +03:00
Lauri Ojansivu 73e165cacf Translate Tajik Trello import controls 2026-09-06 06:29:59 +03:00
Lauri Ojansivu 42aad5c9c6 Update Tajik board import progress 2026-09-06 06:28:52 +03:00
Lauri Ojansivu 8ad70ab7c4 Translate Tajik filters and board imports 2026-09-06 06:28:37 +03:00
Lauri Ojansivu ad7e40868d Update Tajik export progress 2026-09-06 06:26:30 +03:00
Lauri Ojansivu 8ae57c4d26 Translate Tajik exports and filters 2026-09-06 06:26:13 +03:00
Lauri Ojansivu 745a47e1f7 Update Tajik email progress 2026-09-06 06:25:10 +03:00
Lauri Ojansivu b51550795b Translate Tajik emails and validation 2026-09-06 06:24:51 +03:00
Lauri Ojansivu 5e4dcd59da Update Tajik custom field progress 2026-09-06 06:23:43 +03:00
Lauri Ojansivu 6a2c8d4c50 Translate Tajik roles and custom fields 2026-09-06 06:23:25 +03:00
Lauri Ojansivu 36cc97cf21 Update Tajik color progress 2026-09-06 06:22:20 +03:00
Lauri Ojansivu 191a9745e8 Translate Tajik card aging and colors 2026-09-06 06:22:03 +03:00
Lauri Ojansivu 76471a2247 Update Tajik member mapping progress 2026-09-06 06:20:58 +03:00
Lauri Ojansivu 97b7bed78c Translate Tajik member mapping and themes 2026-09-06 06:20:41 +03:00
Lauri Ojansivu 759d0088b4 Update Tajik voting progress 2026-09-06 06:19:35 +03:00
Lauri Ojansivu 23f66942ff Translate Tajik voting and imports 2026-09-06 06:19:18 +03:00
Lauri Ojansivu 591c2dff1a Update Tajik board view progress 2026-09-06 06:18:17 +03:00
Lauri Ojansivu 2acbb9c39a Translate Tajik board views and archives 2026-09-06 06:18:00 +03:00
Lauri Ojansivu 8d9946ee84 Update Tajik archive progress 2026-09-06 06:16:56 +03:00
Lauri Ojansivu 619f6dd5b2 Translate Tajik administration and archives 2026-09-06 06:16:39 +03:00
Lauri Ojansivu e7b29cfbac Update Tajik board layout progress 2026-09-06 06:15:37 +03:00
Lauri Ojansivu a2435b4711 Translate Tajik board layout controls 2026-09-06 06:15:22 +03:00
Lauri Ojansivu 382dace98c Update Tajik workspace progress 2026-09-06 06:14:14 +03:00
Lauri Ojansivu 4d5e64e403 Translate Tajik activities and workspaces 2026-09-06 06:13:56 +03:00
Lauri Ojansivu f2a88a5c48 Record initial Tajik translation progress 2026-09-06 06:12:35 +03:00
Lauri Ojansivu 3a6029967c Start complete Tajik translations 2026-09-06 06:12:11 +03:00
Lauri Ojansivu 207e7e9aea Record complete Southern Sotho translations 2026-09-06 06:10:28 +03:00
Lauri Ojansivu 34157960f3 Complete Southern Sotho translations 2026-09-06 06:10:12 +03:00
Lauri Ojansivu 48121e0f45 Update Southern Sotho repair progress 2026-09-06 06:09:19 +03:00
Lauri Ojansivu bc595ceab8 Translate Southern Sotho accounts and repairs 2026-09-06 06:09:02 +03:00
Lauri Ojansivu 7ff7e8bcee Update Southern Sotho monitoring progress 2026-09-06 06:07:58 +03:00
Lauri Ojansivu 18023794b2 Translate Southern Sotho migration monitoring 2026-09-06 06:07:42 +03:00
Lauri Ojansivu dfa500c03b Update Southern Sotho migration step progress 2026-09-06 06:06:44 +03:00
Lauri Ojansivu 52bc5af9cc Translate Southern Sotho migration steps 2026-09-06 06:06:30 +03:00
Lauri Ojansivu c4db25f335 Update Southern Sotho board repair progress 2026-09-06 06:05:31 +03:00
Lauri Ojansivu a0b57eea01 Translate Southern Sotho board repairs 2026-09-06 06:05:13 +03:00
Lauri Ojansivu 4f9b83dc1c Update Southern Sotho storage migration progress 2026-09-06 06:04:04 +03:00
Lauri Ojansivu d9062aa2df Translate Southern Sotho storage migrations 2026-09-06 06:03:49 +03:00
Lauri Ojansivu e4524fafe8 Update Southern Sotho cloud progress 2026-09-06 06:02:47 +03:00
Lauri Ojansivu 5160a9b239 Translate Southern Sotho cloud backups 2026-09-06 06:02:31 +03:00
Lauri Ojansivu 8f0aeb1f3b Update Southern Sotho security progress 2026-09-06 06:01:18 +03:00
Lauri Ojansivu 274c6e2959 Translate Southern Sotho security and backups 2026-09-06 06:01:01 +03:00
Lauri Ojansivu ee81399ecc Update Southern Sotho migration progress 2026-09-06 05:58:53 +03:00
Lauri Ojansivu 3094dc52d6 Translate Southern Sotho jobs and migrations 2026-09-06 05:58:39 +03:00
Lauri Ojansivu 0e8aa90582 Update Southern Sotho lockout progress 2026-09-06 05:57:32 +03:00
Lauri Ojansivu 759a68d8bc Translate Southern Sotho access and lockout settings 2026-09-06 05:57:15 +03:00
Lauri Ojansivu 214314e3af Update Southern Sotho support progress 2026-09-06 05:56:15 +03:00
Lauri Ojansivu 404b9b56a9 Translate Southern Sotho board status and support 2026-09-06 05:55:58 +03:00
Lauri Ojansivu 1a37023f04 Update Southern Sotho storage progress 2026-09-06 05:54:59 +03:00
Lauri Ojansivu 1015980a32 Translate Southern Sotho attachment storage 2026-09-06 05:54:45 +03:00
Lauri Ojansivu 915ca5f293 Update Southern Sotho checklist progress 2026-09-06 05:53:43 +03:00
Lauri Ojansivu be085449bf Translate Southern Sotho teams and checklists 2026-09-06 05:53:28 +03:00
Lauri Ojansivu ae009f8d5b Update Southern Sotho recovery progress 2026-09-06 05:52:29 +03:00
Lauri Ojansivu 434e5c2ae9 Translate Southern Sotho recovery and support 2026-09-06 05:52:14 +03:00
Lauri Ojansivu 36750b8692 Update Southern Sotho report progress 2026-09-06 05:51:14 +03:00
Lauri Ojansivu b171fa4bb6 Translate Southern Sotho reports and maps 2026-09-06 05:50:44 +03:00
Lauri Ojansivu 56f65519c9 Update Southern Sotho dependency progress 2026-09-06 05:48:56 +03:00
Lauri Ojansivu df539e5aae Translate Southern Sotho dependencies and locations 2026-09-06 05:48:34 +03:00
Lauri Ojansivu 922d2860cb Update Southern Sotho search instruction progress 2026-09-06 05:47:19 +03:00
Lauri Ojansivu b6445d8fa9 Translate Southern Sotho search instructions 2026-09-06 05:46:28 +03:00
Lauri Ojansivu 0039365c74 Update Southern Sotho search operator progress 2026-09-06 05:44:51 +03:00
Lauri Ojansivu d2aead270c Translate Southern Sotho global search operators 2026-09-06 05:44:31 +03:00
Lauri Ojansivu 52017c1fd4 Update Southern Sotho search translation progress 2026-09-06 05:43:16 +03:00
Lauri Ojansivu 78a9c63f6a Translate Southern Sotho shared views and search 2026-09-06 05:42:55 +03:00
Lauri Ojansivu 47861d7a3a Update Southern Sotho role translation progress 2026-09-06 05:41:38 +03:00
Lauri Ojansivu 0f8781cd90 Translate Southern Sotho roles and weekdays 2026-09-06 05:41:21 +03:00
Lauri Ojansivu c5593785e4 Update Southern Sotho event translation progress 2026-09-06 05:40:14 +03:00
Lauri Ojansivu b430fa06ac Translate Southern Sotho events and interface settings 2026-09-06 05:39:55 +03:00
Lauri Ojansivu 7102ffb852 Update Southern Sotho metadata translation progress 2026-09-06 05:38:35 +03:00
Lauri Ojansivu dfc6314207 Translate Southern Sotho automation and web metadata 2026-09-06 05:38:13 +03:00
Lauri Ojansivu d0909761c2 Update Southern Sotho automation action progress 2026-09-06 05:37:07 +03:00
Lauri Ojansivu 6043122a7b Translate Southern Sotho automation actions 2026-09-06 05:36:49 +03:00
Lauri Ojansivu 6e0c7464ef Update Southern Sotho automation translation progress 2026-09-06 05:35:41 +03:00
Lauri Ojansivu 2dfb136e26 Translate Southern Sotho scheduled automation 2026-09-06 05:35:25 +03:00
Lauri Ojansivu a9543d94b0 Update Southern Sotho automation progress 2026-09-06 05:34:22 +03:00
Lauri Ojansivu e36fd9233f Translate Southern Sotho automation builder 2026-09-06 05:34:04 +03:00
Lauri Ojansivu e3cf2cf896 Update Southern Sotho card settings progress 2026-09-06 05:32:59 +03:00
Lauri Ojansivu 916960c8b6 Translate Southern Sotho card and subtask settings 2026-09-06 05:32:44 +03:00
Lauri Ojansivu e95b621d80 Update Southern Sotho system translation progress 2026-09-06 05:31:33 +03:00
Lauri Ojansivu bef4a46c78 Translate Southern Sotho system and organization settings 2026-09-06 05:31:15 +03:00
Lauri Ojansivu e737d3707c Update Southern Sotho transfer translation progress 2026-09-06 05:30:08 +03:00
Lauri Ojansivu 2a9dfb3a4f Translate Southern Sotho transfer and webhook settings 2026-09-06 05:29:53 +03:00
Lauri Ojansivu 3d0ec03489 Update Southern Sotho branding translation progress 2026-09-06 05:28:45 +03:00
Lauri Ojansivu d6ce2c2c07 Translate Southern Sotho tracking and branding 2026-09-06 05:28:30 +03:00
Lauri Ojansivu 49c64725d3 Update Southern Sotho access translation progress 2026-09-06 05:27:24 +03:00
Lauri Ojansivu 9d4099479a Translate Southern Sotho access and shortcuts 2026-09-06 05:27:09 +03:00
Lauri Ojansivu 90c12c5de6 Update Southern Sotho selection translation progress 2026-09-06 05:26:06 +03:00
Lauri Ojansivu c63f9afb07 Translate Southern Sotho list and selection controls 2026-09-06 05:25:52 +03:00
Lauri Ojansivu 39d89e5024 Update Southern Sotho Trello translation progress 2026-09-06 05:24:47 +03:00
Lauri Ojansivu f03c0ff85e Translate Southern Sotho Trello import controls 2026-09-06 05:24:32 +03:00
Lauri Ojansivu 35f0505549 Update Southern Sotho import translation progress 2026-09-06 05:23:28 +03:00
Lauri Ojansivu 8b83db49f7 Translate Southern Sotho filters and board imports 2026-09-06 05:23:11 +03:00
Lauri Ojansivu b4d979eda2 Update Southern Sotho export translation progress 2026-09-06 05:21:10 +03:00
Lauri Ojansivu a1546ddf99 Translate Southern Sotho exports and filters 2026-09-06 05:20:55 +03:00
Lauri Ojansivu 6049a36353 Update Southern Sotho email translation progress 2026-09-06 05:19:49 +03:00
Lauri Ojansivu 7372a6749d Translate Southern Sotho email and validation 2026-09-06 05:19:34 +03:00
Lauri Ojansivu 3ae9fcfc4f Update Southern Sotho custom field progress 2026-09-06 05:18:28 +03:00
Lauri Ojansivu a3adf7e1f6 Translate Southern Sotho roles and custom fields 2026-09-06 05:18:12 +03:00
Lauri Ojansivu 0d678c525d Update Southern Sotho color translation progress 2026-09-06 05:17:11 +03:00
Lauri Ojansivu 92d54efa19 Translate Southern Sotho navigation and colors 2026-09-06 05:16:57 +03:00
Lauri Ojansivu 5fd96553d3 Update Southern Sotho appearance progress 2026-09-06 05:16:00 +03:00
Lauri Ojansivu 203d9f2b59 Translate Southern Sotho member and appearance dialogs 2026-09-06 05:15:45 +03:00
Lauri Ojansivu a75515554b Update Southern Sotho voting translation progress 2026-09-06 05:14:47 +03:00
Lauri Ojansivu f86de62559 Translate Southern Sotho voting and imports 2026-09-06 05:14:33 +03:00
Lauri Ojansivu abee4f3e72 Update Southern Sotho board view progress 2026-09-06 05:13:39 +03:00
Lauri Ojansivu 3732219e58 Translate Southern Sotho board views and archives 2026-09-06 05:13:24 +03:00
Lauri Ojansivu 36a993f171 Update Southern Sotho administration progress 2026-09-06 05:12:24 +03:00
Lauri Ojansivu 43982c8e36 Translate Southern Sotho administration and archives 2026-09-06 05:12:05 +03:00
Lauri Ojansivu f53da93c82 Update Southern Sotho layout translation progress 2026-09-06 05:11:02 +03:00
Lauri Ojansivu 74aa1e7d00 Translate Southern Sotho board layout controls 2026-09-06 05:10:47 +03:00
Lauri Ojansivu 241d89a9bd Update Southern Sotho translation progress 2026-09-06 05:09:49 +03:00
Lauri Ojansivu 58c79fe873 Start Southern Sotho translation backlog 2026-09-06 05:09:34 +03:00
Lauri Ojansivu 4cb25bc188 Record completed Albanian translations 2026-09-06 05:08:01 +03:00
Lauri Ojansivu 15494a9093 Complete Albanian translation backlog 2026-09-06 05:07:39 +03:00
Lauri Ojansivu fb3d103637 Update Albanian migration translation progress 2026-09-06 05:06:19 +03:00
Lauri Ojansivu 85fdcaadc5 Translate Albanian board integrity migrations 2026-09-06 05:06:03 +03:00
Lauri Ojansivu c4c84def33 Update Albanian cloud translation progress 2026-09-06 05:04:37 +03:00
Lauri Ojansivu 9055e4fa52 Translate Albanian backup and cloud storage settings 2026-09-06 05:04:23 +03:00
Lauri Ojansivu 04961042b5 Update Albanian migration translation progress 2026-09-06 05:02:51 +03:00
Lauri Ojansivu 4c5af08f24 Translate Albanian migration and security settings 2026-09-06 05:02:36 +03:00
Lauri Ojansivu b1f82692fb Update Albanian translation progress 2026-09-06 04:59:33 +03:00
Lauri Ojansivu 990dad824f Translate Albanian accessibility and scheduled jobs 2026-09-06 04:59:07 +03:00
Lauri Ojansivu 10481a579c Update Albanian attachment translation progress 2026-09-06 04:56:50 +03:00
Lauri Ojansivu 6f48675db1 Translate Albanian attachment administration 2026-09-06 04:56:33 +03:00
Lauri Ojansivu 07daa6923f Update Albanian report translation progress 2026-09-06 04:54:42 +03:00
Lauri Ojansivu 8cf11e4a4a Translate Albanian reports and support 2026-09-06 04:54:10 +03:00
Lauri Ojansivu a4c4bf46de Update Albanian search help progress 2026-09-06 04:52:50 +03:00
Lauri Ojansivu c3ed2cd5e0 Translate Albanian search help and dependencies 2026-09-06 04:52:33 +03:00
Lauri Ojansivu 91e1e33dc1 Update Albanian search translation progress 2026-09-06 04:50:58 +03:00
Lauri Ojansivu 6bd9f6fae9 Translate Albanian shared views and search 2026-09-06 04:50:43 +03:00
Lauri Ojansivu 2c08b24d20 Update Albanian role translation progress 2026-09-06 04:49:27 +03:00
Lauri Ojansivu 71021503aa Translate Albanian roles and account controls 2026-09-06 04:49:13 +03:00
Lauri Ojansivu 2d5d8fde45 Update Albanian automation action progress 2026-09-06 04:47:50 +03:00
Lauri Ojansivu 31ebe4ecaa Translate Albanian automation actions 2026-09-06 04:47:33 +03:00
Lauri Ojansivu eabdc65d7d Update Albanian automation translation progress 2026-09-06 04:46:15 +03:00
Lauri Ojansivu 2d8caf91a9 Translate Albanian automation builder 2026-09-06 04:46:00 +03:00
Lauri Ojansivu 4117e9cbfe Update Albanian organization translation progress 2026-09-06 04:44:44 +03:00
Lauri Ojansivu 78f6870145 Translate Albanian organization and card settings 2026-09-06 04:44:29 +03:00
Lauri Ojansivu 84d91c0d90 Update Albanian system translation progress 2026-09-06 04:43:07 +03:00
Lauri Ojansivu 1ba4ec57a2 Translate Albanian uploads and system settings 2026-09-06 04:42:50 +03:00
Lauri Ojansivu f585acbd91 Update Albanian navigation translation progress 2026-09-06 04:41:25 +03:00
Lauri Ojansivu 5aaf204f75 Translate Albanian board navigation 2026-09-06 04:41:02 +03:00
Lauri Ojansivu 8e6e4e5c3d Update Albanian import translation progress 2026-09-06 04:38:47 +03:00
Lauri Ojansivu 86e3716dd8 Translate Albanian import workflows 2026-09-06 04:38:33 +03:00
Lauri Ojansivu 59edd03caf Update Albanian filter translation progress 2026-09-06 04:36:38 +03:00
Lauri Ojansivu ecfdfbbef1 Translate Albanian email exports and filters 2026-09-06 04:36:22 +03:00
Lauri Ojansivu 8fded00226 Update Albanian role translation progress 2026-09-06 04:34:56 +03:00
Lauri Ojansivu 1605063bd2 Translate Albanian roles and custom fields 2026-09-06 04:34:27 +03:00
Lauri Ojansivu 24a00d0ac2 Update Albanian translation backlog 2026-09-06 04:32:57 +03:00
Lauri Ojansivu fa447f0ab2 Translate Albanian dialogs and appearance 2026-09-06 04:32:33 +03:00
Lauri Ojansivu aed4542924 Update Albanian translation progress 2026-09-06 04:30:46 +03:00
Lauri Ojansivu 674abb4ff7 Translate Albanian board and card views 2026-09-06 04:30:13 +03:00
Lauri Ojansivu 834dc90838 Update ongoing translation progress 2026-09-06 04:28:17 +03:00
Lauri Ojansivu 88c7edcaab Continue Albanian translation backlog 2026-09-06 04:27:58 +03:00
Lauri Ojansivu c6f096e02a Update translation backlog roadmap 2026-09-06 03:22:49 +03:00
Lauri Ojansivu 47b560ccd0 Translate first Albanian backlog batch 2026-09-06 03:22:17 +03:00
github-actions[bot] b6efda66c4 Bump versions for v11.53 2026-09-05 23:40:42 +00:00
Lauri Ojansivu dfdb8fe187 Prepare v11.53 release 2026-09-06 02:39:31 +03:00
Lauri Ojansivu dfb336d422 Update changelog for Amiga-safe filenames 2026-09-06 02:33:14 +03:00
Lauri Ojansivu 829d2a6c74 Enforce Amiga-safe filenames on every read 2026-09-06 02:28:46 +03:00
Lauri Ojansivu a918ebe9b0 Update changelog for CodeQL test fixes 2026-09-06 01:10:34 +03:00
Lauri Ojansivu 596d99fc4a Remove incomplete sanitizer test doubles 2026-09-06 01:09:33 +03:00
github-actions[bot] 3ffa2bee87 Bump versions for v11.52 2026-09-05 21:53:09 +00:00
Lauri Ojansivu 138d0ba02c Prepare v11.52 release 2026-09-06 00:51:56 +03:00
Lauri Ojansivu f9e8eccbed CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-05 23:51:04 +03:00
Lauri Ojansivu c00f73e004 Complete upcoming recovery documentation changelog 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 0489128239 Document stronger FerretDB password credentials 2026-09-05 23:51:02 +03:00
Lauri Ojansivu b7edc0917b Fix recovery documentation indexes 2026-09-05 23:51:02 +03:00
Lauri Ojansivu ff674e065f Update changelog for streamed export security 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 69db6a3722 Sanitize streamed board exports 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 99a4737cec Update changelog for secure durable imports 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 71ad5447aa Secure and resume import export operations 2026-09-05 23:51:02 +03:00
Lauri Ojansivu f06794343e Design shared import export sanitization 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 5154939a41 Design complete restart-safe import and export 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 175eea9810 Design restart-safe durable operations 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 2281ddd0e8 Update changelog for workflow diagnostics 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 1eb273bf1c Make workflow failures diagnosable 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 63c6588d6c Update changelog for release build fixes 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 0bce2330ae Fix Windows and variant release builds 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 4a2f432910 Update upcoming changelog for SheetColorBleed 2026-09-05 23:51:02 +03:00
Lauri Ojansivu e54b123c10 Validate XLSX sheet colors before CSS serialization
Thanks to rbbjinioeq and xet7 !
2026-09-05 23:51:02 +03:00
Lauri Ojansivu 30ec8998ed Update upcoming changelog for verified recovery 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 506c2697a0 Add verified low-load recovery and integrity audits 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 6d5bcb4fc1 Extend verified recovery integrity design 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 3980dd9fc3 Design verified recovery and low-load maintenance 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 4ca6f6dac7 Update upcoming changelog for security audit 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 90158d5012 Audit security coverage and recovery failures 2026-09-05 23:51:02 +03:00
Lauri Ojansivu 595aae12cb Add mobile regression test changelog 2026-09-05 23:51:02 +03:00
Lauri Ojansivu bfac4c842f Keep layout regressions aligned with mobile mode 2026-09-05 23:51:02 +03:00
Lauri Ojansivu be51bf8ff5 Merge pull request #6674 from wekan/dependabot/npm_and_yarn/pretty-ms-9.3.1
Bump pretty-ms from 9.3.0 to 9.3.1
2026-09-05 23:47:47 +03:00
Lauri Ojansivu 0fcf3b355f Merge pull request #6673 from wekan/dependabot/npm_and_yarn/i18next-26.4.1
Bump i18next from 26.4.0 to 26.4.1
2026-09-05 23:47:32 +03:00
dependabot[bot] f5b02dbcfb Bump i18next from 26.4.0 to 26.4.1
Bumps [i18next](https://github.com/i18next/i18next) from 26.4.0 to 26.4.1.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.4.0...v26.4.1)

---
updated-dependencies:
- dependency-name: i18next
  dependency-version: 26.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-05 20:41:41 +00:00
dependabot[bot] 50482bd030 Bump pretty-ms from 9.3.0 to 9.3.1
Bumps [pretty-ms](https://github.com/sindresorhus/pretty-ms) from 9.3.0 to 9.3.1.
- [Release notes](https://github.com/sindresorhus/pretty-ms/releases)
- [Commits](https://github.com/sindresorhus/pretty-ms/compare/v9.3.0...v9.3.1)

---
updated-dependencies:
- dependency-name: pretty-ms
  dependency-version: 9.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-05 20:41:38 +00:00
Lauri Ojansivu 20d7c43a4f Merge pull request #6675 from wekan/dependabot/npm_and_yarn/aws-sdk/client-s3-3.1125.0
Bump @aws-sdk/client-s3 from 3.1119.0 to 3.1125.0
2026-09-05 23:40:20 +03:00
Lauri Ojansivu 8a322f6e3a Merge pull request #6672 from wekan/dependabot/npm_and_yarn/pdfkit-0.20.2
Bump pdfkit from 0.20.1 to 0.20.2
2026-09-05 23:39:38 +03:00
Lauri Ojansivu a5b4e6cc02 Merge pull request #6671 from wekan/dependabot/npm_and_yarn/hotkeys-js-4.0.7
Bump hotkeys-js from 4.0.5 to 4.0.7
2026-09-05 23:39:26 +03:00
dependabot[bot] a51fb2af99 Bump @aws-sdk/client-s3 from 3.1119.0 to 3.1125.0
Bumps [@aws-sdk/client-s3](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-s3) from 3.1119.0 to 3.1125.0.
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-s3/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.1125.0/clients/client-s3)

---
updated-dependencies:
- dependency-name: "@aws-sdk/client-s3"
  dependency-version: 3.1125.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-05 20:33:28 +00:00
dependabot[bot] e08b868361 Bump pdfkit from 0.20.1 to 0.20.2
Bumps [pdfkit](https://github.com/foliojs/pdfkit) from 0.20.1 to 0.20.2.
- [Release notes](https://github.com/foliojs/pdfkit/releases)
- [Changelog](https://github.com/foliojs/pdfkit/blob/master/CHANGELOG.md)
- [Commits](https://github.com/foliojs/pdfkit/compare/v0.20.1...v0.20.2)

---
updated-dependencies:
- dependency-name: pdfkit
  dependency-version: 0.20.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-05 20:32:54 +00:00
dependabot[bot] 965351da45 Bump hotkeys-js from 4.0.5 to 4.0.7
Bumps [hotkeys-js](https://github.com/jaywcjlove/hotkeys-js) from 4.0.5 to 4.0.7.
- [Release notes](https://github.com/jaywcjlove/hotkeys-js/releases)
- [Commits](https://github.com/jaywcjlove/hotkeys-js/compare/v4.0.5...v4.0.7)

---
updated-dependencies:
- dependency-name: hotkeys-js
  dependency-version: 4.0.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-05 20:32:44 +00:00
Lauri Ojansivu 9680fe8577 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-05 18:47:57 +03:00
Lauri Ojansivu b433e63736 Update build menu exit changelog 2026-09-05 18:47:57 +03:00
Lauri Ojansivu 1cb52ee213 Exit Windows build menu after commands 2026-09-05 18:47:57 +03:00
Lauri Ojansivu 1745e882b5 Add build menu prompt changelog 2026-09-05 18:47:57 +03:00
Lauri Ojansivu e384ac9693 Return from build commands without pausing 2026-09-05 18:47:57 +03:00
github-actions[bot] 10b9188f72 Bump versions for v11.51 2026-09-05 15:41:09 +00:00
Lauri Ojansivu dacea4cfe4 Prepare v11.51 release 2026-09-05 18:40:08 +03:00
Lauri Ojansivu 369d9f0063 Add Windows single EXE build fix changelog 2026-09-05 18:35:54 +03:00
Lauri Ojansivu 4fae0377ed Run Windows single EXE packer on Windows 2026-09-05 18:35:25 +03:00
Lauri Ojansivu 0dd02e47b4 Add release version consistency changelog
Thanks to xet7 !
2026-09-05 18:30:57 +03:00
Lauri Ojansivu f2bb456be1 Verify all version references before releasing
Add a read-only release consistency gate after version.sh and before the workflow commits its bump. Reject stale package, lockfile, Docker, Snap, Stacker, Sandstorm, bundle URL, or Meteor metadata versions with explicit errors and regression coverage.

Thanks to xet7 !
2026-09-05 18:30:29 +03:00
Lauri Ojansivu 5ca13e2fa4 Publish Meteor version from the canonical release pin
Generate website version information from .meteor/release instead of stale Docker metadata, and synchronize that metadata during every release bump. Cover a prerelease mismatch where Docker says beta but the actual Meteor build pin says rc.

Thanks to xet7 !
2026-09-05 18:29:04 +03:00
Lauri Ojansivu a976f1ab78 Add cross-platform Git mirror changelog
Thanks to xet7 !
2026-09-05 18:19:03 +03:00
Lauri Ojansivu 5096629482 Support Git mirror updates on Linux macOS and Windows
Resolve the Unix checkout relative to the release script so both documented Linux and macOS locations work, and add a Windows batch version for the Downloads checkout. Ensure existing mirrors are updated on repeat runs and add non-network regression coverage for paths and commands.

Thanks to xet7 !
2026-09-05 18:17:57 +03:00
Lauri Ojansivu 185bb3ff2c Added script for updating git mirrors.
Thanks to xet7 !
2026-09-05 18:13:38 +03:00
Lauri Ojansivu e2ba4d664e Updated translations. 2026-09-05 17:43:37 +03:00
github-actions[bot] bd384abcde Bump versions for v11.50 2026-09-05 14:11:29 +00:00
Lauri Ojansivu 0c4dac061e Prepare v11.50 release 2026-09-05 17:10:24 +03:00
Lauri Ojansivu 7aa4593615 Add mobile handle alignment changelog
Thanks to xet7 !
2026-09-05 17:03:41 +03:00
Lauri Ojansivu e7dde0db3c Align mobile card and swimlane drag handles
Center the minicard drag glyph directly beneath its menu without a scaled offset. Use the same compact swimlane handle markup and position on touch and mouse devices, and cover both computed positions in the live browser suite.

Thanks to xet7 !
2026-09-05 17:03:28 +03:00
Lauri Ojansivu c5f94d282f Add stable mobile top header changelog
Thanks to xet7 !
2026-09-05 16:47:42 +03:00
Lauri Ojansivu cb2dec9dd7 Keep mobile top header stable when opening lists
Do not inject board list names into the quick-access bar when a list opens in Mobile Mode. Keep list navigation in the swimlane rows and verify the header text and height remain unchanged in the live browser test.

Thanks to xet7 !
2026-09-05 16:47:26 +03:00
Lauri Ojansivu b1eb7303c7 Add stable mobile swimlane row heights changelog
Document the list-scoped header state and regression coverage that keep untouched swimlane list rows at their existing height.

Thanks to xet7 !
2026-09-05 16:36:05 +03:00
Lauri Ojansivu 7968f522d8 Keep mobile list row heights stable across swimlanes
Scope the mobile list-header selected state to the list whose ID is selected, so compact rows in other swimlanes retain the same controls and height. Extend source and live browser coverage to compare untouched row heights before and after opening another swimlane's list.

Thanks to xet7 !
2026-09-05 16:35:48 +03:00
Lauri Ojansivu 6b8e7e7cdd Add mobile swimlane list changelog 2026-09-05 16:28:57 +03:00
Lauri Ojansivu c002bc2c15 Keep other swimlane lists visible in mobile mode 2026-09-05 16:28:40 +03:00
Lauri Ojansivu 3ddf00f234 Add Safari minicard handle changelog 2026-09-05 16:08:46 +03:00
Lauri Ojansivu 418d53aa7f Match Safari minicard handle background 2026-09-05 16:08:32 +03:00
Lauri Ojansivu 22508d9789 Add mobile minicard control changelog 2026-09-05 16:04:28 +03:00
Lauri Ojansivu e48c969fa8 Use one minicard handle layout in mobile mode 2026-09-05 16:04:05 +03:00
Lauri Ojansivu 772a5d2872 Add API usage flush changelog 2026-09-05 15:50:46 +03:00
Lauri Ojansivu bd668f6b8f Allow API usage fields in EventLog 2026-09-05 15:50:26 +03:00
Lauri Ojansivu 0434430b5f Add minicard handle alignment changelog 2026-09-05 14:39:24 +03:00
Lauri Ojansivu 3c2702d9e2 Align the minicard drag handle icon 2026-09-05 14:39:12 +03:00
Lauri Ojansivu 9d06eb04b7 Add minicard drag handle changelog 2026-09-05 14:22:53 +03:00
Lauri Ojansivu 5b03743acd Keep minicard drag handle background transparent 2026-09-05 14:22:20 +03:00
Lauri Ojansivu e593533956 Update changelog for consistency test fixes 2026-09-05 13:56:14 +03:00
Lauri Ojansivu e5831f16b1 Fix consistency checks from newest test run 2026-09-05 13:55:54 +03:00
Lauri Ojansivu 8aa6d11416 Update changelog for Dependabot mirror exclusion 2026-09-05 13:15:28 +03:00
Lauri Ojansivu c44b5af361 Exclude Dependabot from variant repository sync 2026-09-05 13:15:13 +03:00
Lauri Ojansivu bbfcabbe6b Merge branch 'main' of https://github.com/wekan/wekan 2026-09-05 13:14:45 +03:00
Lauri Ojansivu 4fc32d6efa Update changelog for email Markdown fix 2026-09-05 12:56:25 +03:00
Lauri Ojansivu e280819114 Remove Liquid wrapper from email troubleshooting 2026-09-05 12:56:11 +03:00
Lauri Ojansivu 5553757193 Update changelog for newest test fixes 2026-09-05 12:54:02 +03:00
Lauri Ojansivu 87896365ae Fix newest unit and minicard browser tests 2026-09-05 12:53:50 +03:00
Lauri Ojansivu 2bdb88314d Merge pull request #6668 from msgwing/docs/office365-basic-auth-notice
docs: the Microsoft Office 365 mail example uses Basic authentication, which Microsoft is retiring
2026-09-05 12:50:17 +03:00
Lauri Ojansivu 6bf50e4eca Update WeKan changelog for variant repository sync 2026-09-05 12:41:00 +03:00
Lauri Ojansivu abdd9750c6 Update Ondra and Gantt repositories during releases 2026-09-05 12:39:57 +03:00
Lauri Ojansivu 1a36433e6b Update upcoming WeKan changelog 2026-09-05 12:28:55 +03:00
Lauri Ojansivu 8aed6a9841 Fix CodeQL string escaping and regex alerts
Escape backslashes before quotes in OOXML CSS font families, and replace four backtracking language-registry regexes with a linear parser.\n\nThanks to GitHub CodeQL and xet7 !
2026-09-05 12:28:28 +03:00
Lauri Ojansivu 0c963cae3c Update upcoming WeKan changelog 2026-09-05 12:17:18 +03:00
Lauri Ojansivu 1af5ceae28 Document Admin Panel email providers
Put the Admin Panel email-provider option at the top of email troubleshooting and clarify its opt-in relationship with MAIL_URL across related documentation.\n\nThanks to xet7 !
2026-09-05 12:16:58 +03:00
Lauri Ojansivu 7015ecbd8a Update upcoming WeKan changelog 2026-09-05 12:03:46 +03:00
Lauri Ojansivu bd8b58e5b1 Fix the commented minicard editor CSS
Avoid terminating the outer disabled-editor comment with a nested CSS comment.\n\nThanks to xet7 !
2026-09-05 11:56:21 +03:00
Lauri Ojansivu b9d3d94e59 Test card sorting with drag handles enabled
Cover card reordering through the visible handle as well as through the title when handles are disabled.\n\nThanks to xet7 !
2026-09-05 11:55:35 +03:00
Lauri Ojansivu 277585e79b Update upcoming WeKan changelog 2026-09-05 11:54:52 +03:00
Lauri Ojansivu 2c9896ef97 Use the minicard title as a drag surface
Keep direct minicard title editing commented out. Without drag handles, the title moves the card; with handles, it remains available for board drag-scrolling.\n\nThanks to xet7 !
2026-09-05 11:54:43 +03:00
Lauri Ojansivu b212815403 Translate the first 60 Albanian strings, matching the terms already in the file.
The activity strings and the comment/organisation settings, using the
vocabulary sq already established - Tabelë, Kartë, Listë, Korsi, Listë
kontrolli, Etiketa, Bashkëngjitje - so the file stays consistent with the 148
strings that were there.

Every placeholder is copied from the English source unchanged, including the
capital L in __checkList__ that one activity string uses; the file has no
placeholder mismatches.

Albanian: 2176 untranslated to 2116.

Thanks to xet7 !
2026-09-05 05:18:29 +03:00
Lauri Ojansivu 321db47d93 Update upcoming WeKan changelog
Records this batch: the attachment-serving bypass as a SECURITY ISSUE at the
top of the release, the four portability and test fixes under the build-tree
group, and Bosnian under a new translations subsection.

Thanks to xet7 !
2026-09-05 05:16:13 +03:00
Lauri Ojansivu b87082b3dd Refuse a file WeKan will not serve, instead of letting Meteor-Files serve it.
A Playwright spec found this, and it found more than it was asking about.
"stored HTML is forced to a safe download on the original Meteor-Files route"
expected application/octet-stream and got text/html, status 200 - a stored HTML
attachment served inline, which is the stored XSS that
models/lib/fileResponseSafety.js exists to prevent.

That policy module is correct. It was never reached. Meteor-Files calls the
storage strategy's interceptDownload, and a FALSE return means "not handled,
serve it yourself" - so Meteor-Files served the file from its stored path, with
its stored Content-Type, and none of WeKan's headers.

What makes that a bypass rather than a harmless fallback is WHY the strategy
declines. getReadStream() returns nothing when the file cannot be resolved
INSIDE the storage root, which is the containment check of
GHSA-4mxf-m8pq-xc9p. So `false` means "this is not a file WeKan may serve", and
handing that same file to a server with no containment check of its own answers
the refusal with the file. The safest possible verdict and the most dangerous
outcome, from one boolean.

All three strategies answer 404 and claim the request now. So does the abstract
base, whose body was EMPTY - returning undefined, which Meteor-Files reads
exactly as it reads false, so a strategy that forgot to override it failed open
too. A strategy that forgets should serve nothing rather than serve it
unfiltered.

A file that is genuinely absent gets the same 404 it would have got anyway.

Not logged to Admin Panel / Problems, and that is a decision rather than an
omission: the same path is taken by an attachment deleted while a link to it
survived, which is ordinary use, and interceptDownload cannot tell the two
apart - getReadStream() reports only that it has nothing. Telling "outside the
root" from "not there" is what a key would need first.

The spec had also been writing its file to the wrong place. build.sh exports
WEKAN_FILES_PATH_HOST, which is the path mounted into the browser CONTAINER, so
a local run fell back to the spec's own default of .build/bundle/files while the
server read .tools/test-writable/files. It exports WEKAN_FILES_PATH too now, so
the spec exercises a file the server owns - which is what it meant to test, and
without which it was measuring the bypass instead.

tests/attachmentServeFailsClosed.test.cjs pins that NO interceptDownload
anywhere returns false, that each refuses with a 404, that every serving
strategy still goes through the single policy choke point, and that text/html
is still forced to a download by type and by filename - with an ordinary image
still served inline as the negative.

Thanks to xet7 !
2026-09-05 05:14:59 +03:00
Lauri Ojansivu bdb3b15886 Serve attachments when the storage root is a symlink, and finish Bosnian.
FileStoreStrategyFilesystem builds its candidate paths by joining names onto
the storage root AS WRITTEN, then checked each one against that root with every
symlink RESOLVED. Those are the same string only when nothing in the path is a
symlink.

On macOS nothing is: os.tmpdir() is /var/folders/..., a symlink to
/private/var/folders/..., so every candidate failed containment before it was
looked at and getReadStream() returned undefined - WeKan serving none of its
own attachments. A deployment whose data directory is a symlink, which is an
ordinary arrangement, has the same fault on Linux. The mocha suite has been
reporting it all along as "allows reading a regular file from storage root",
which reads like a fussy assertion rather than like a platform that cannot open
attachments.

The lexical pre-filter now uses the root the candidates were built from. The
security property is untouched, because it was never that check which carried
it: what a caller must not do is reach a file OUTSIDE the root, and that is
decided by resolving the candidate and requiring the result to be inside the
resolved root. GHSA-4mxf-m8pq-xc9p's symlink escape and the plain absolute-path
escape are both still refused, and tests/fileStoreSymlinkRoot.test.cjs pins
that against a real symlinked root - including the exact comparison that caused
the bug.

Bosnian: 2175 untranslated strings to 1. Croatian and Serbian are complete and
Bosnian is the same Stokavian standard, so Croatian is the base, with the
documented Bosnian forms applied - sedmica for tjedan, nivo for razina, server
for posluzitelj, tok for tijek, hiljada for tisuca, historija for povijest, and
tacka/tacno for tocka/tocno. 29 strings needed one; the rest are identical in
both standards.

Two substitutions were REVERTED after reading the output, and that is the part
worth keeping: `poveznica` to `link` produced "iz ove linkove" and "iz bilo koje
linkove na kartu", because `poveznice` is both nominative plural and genitive
singular and one rule cannot be both. `poveznica` is good Bosnian, so it stays -
a correct word left alone beats a more idiomatic one put in the wrong case. The
same blindness left "Najviša nivo", feminine adjective on a masculine noun,
which is fixed by matching the whole phrase.

The last ten were translated directly. The one that remains is "Server", which
is spelled that way in Bosnian too - the tool counts a translation identical to
its source as missing, and that is the tool's limit, not a gap.

Thanks to xet7 !
2026-09-05 05:06:37 +03:00
Lauri Ojansivu f532f30462 Fix the last two red suites: a missing utility and a stale sibling checkout.
bundleSmokeBoot. releases/bundle-smoke-boot.sh runs the bundle under `timeout`,
which is GNU coreutils and is not on macOS. It died with "timeout: command not
found" and exit 127 - which the script's own checks then read as "the bundle
exited without reaching its database", reporting a startup failure for a
missing utility. It now uses timeout, or gtimeout, or a shell fallback that
backgrounds the command and kills it, which needs nothing but the shell.

fixedVulnerabilityClasses. The Hall of Fame comparison demanded at least 50
*bleed directories in the wekan.fi checkout as a "is this the right directory?"
sanity check. That number is a count of what was published when the line was
written, so a checkout two months old has fewer and the suite went red over the
state of ANOTHER repository, which no change here can fix.

A stale checkout cannot cause a false failure there: the test asks, of each
vulnerability it lists, whether some test names it, so listing fewer makes the
check smaller and never wrong. What the threshold has to catch is a directory
that is not the Hall of Fame at all, and those have none - so that is what it
asks now. It also looks in .tools/wekan.fi first, which is where CLAUDE.md puts
the website companion, before the older paths beside the repo.

The check itself passes: all 31 vulnerabilities in that checkout are named by a
test.

The node suites are now 721 run, 0 failed.

Thanks to xet7 !
2026-09-05 04:57:22 +03:00
Lauri Ojansivu f611ac222f Make three permanently-red suites pass, two of them macOS bugs.
These had been failing on every run, and each turned out to be a different
fault rather than a broken assertion.

autopickReadLeavesNoTrace. snap-src/bin/database-autopick reads MongoDB's
data-file mtimes so that starting mongod to compare the two databases does not
make MongoDB look freshly written. It spelled that with `stat -c %Y` and
`touch -d @EPOCH`, which are GNU. On macOS the stat fails, every file is
skipped by the `|| continue` beside it, MONGO_MTIME_BEFORE stays 0, and the
restore returns having done nothing - silently, and only there. The snap runs
on Linux, but WeKan is developed on macOS and this test runs the real functions
wherever it is run. They now try the GNU spelling and fall back to the BSD one.

provenanceTable. releases/provenance-table.sh opened with
`shopt -s nullglob globstar`, and globstar arrived in bash 4 while macOS still
ships bash 3.2 as /bin/bash: "shopt: globstar: invalid shell option name", and
`set -e` took the script with it. The default file list is a single `find` now,
recursive as `**/` was, with -print0 so a path containing a space survives.
Then the empty case failed too - under `set -u`, bash 3.2 calls an empty array
an unbound variable where 4.4 does not - so the loop uses the
`${files[@]+"${files[@]}"}` form.

sesothoTranslationProgress. Two faults. The script's own `--list` output was
TRUNCATED whenever stdout was a pipe: it prints 128 KB with console.log and
then calls process.exit, which cuts off whatever has not drained, and a pipe
delivered 65,510 bytes - valid-looking JSON stopping mid-key, with status 0.
Redirecting to a file worked, because stdout to a file is synchronous, so this
only bit anything that read the output programmatically. It is written with
fs.writeSync in a loop now, EAGAIN retried, before the exit. The test's other
half asserted an EXACT count of untranslated strings, which went red when
ENGLISH gained the four history-change-* keys - a fact about English, not about
Sesotho. It is a ceiling now: still catches a translation being lost, and does
not demand editing for every new string.

Two of the three guards were updated rather than the code, and both times
because they pinned a spelling rather than a behaviour - the exact globstar
pattern, and an exact count. Both now assert the property that was wanted.

A note for the next one: two of these assertions had to be re-scoped to the
CODE because they matched the COMMENT explaining them. Prose satisfying an
assertion about code is how a guard passes while testing nothing.

Thanks to xet7 !
2026-09-05 04:53:58 +03:00
Lauri Ojansivu dad0aaef99 Update upcoming WeKan changelog
Records the open-file limit fix: mongod started with 256 descriptors, warned
about it, and aborted thirteen minutes into a Playwright run - after which
every spec reported ECONNREFUSED as if the database had never started.

Thanks to xet7 !
2026-09-05 04:43:44 +03:00
Lauri Ojansivu 80c0f6875b Raise the open-file limit, so mongod does not abort mid test run.
A full Playwright run died thirteen minutes in and every spec after it
reported the same thing:

  MongoServerSelectionError: connect ECONNREFUSED 127.0.0.1:3001

which reads like the test database was never started. It was: it started at
03:03:03, said what was wrong with it in the same breath, and was ignored.

  "Soft rlimits for open file descriptors too low"
  currentValue: 256, recommendedMinimum: 64000

Thirteen minutes later it ran out:

  Error accepting new connection ... "Too many open files"
  __directory_list_worker ... journal: directory-list: opendir
  WT_PANIC: WiredTiger library panic ... the process must exit and restart
  build.sh: line 1148: 22176 Abort trap: 6   mongod --port 3001 ...

macOS starts a shell with a soft limit of 256 open files. build.sh never
raised it, so every run of the browser suites was a race between finishing and
running out of descriptors - and the failure lands 10,000 lines away in another
log, in a form that points at the wrong thing entirely.

ensure_open_files sits beside ensure_inotify_watches and runs on every
invocation, for the same reason: a limit that is too low breaks a later step
with an error that does not name it. Unlike that one it needs no root - the
hard limit is normally unlimited, so the process raises its own soft limit and
mongod, the bundle server and the browsers inherit it.

Two details, both found by running it rather than reading it:

  It sets the SOFT limit explicitly. Plain `ulimit -n` sets soft and hard, and
  lowering a hard limit is irreversible for the process - the first version
  lowered its own ceiling and could then raise nothing.

  It clamps to the hard limit and steps down from there. Asking for more than
  the hard limit fails outright rather than clamping, and macOS also caps a
  process at kern.maxfilesperproc, which the hard limit does not always
  reflect.

tests/buildScriptOpenFiles.test.cjs runs the function in shells with 256,
70000, and a 5000 hard limit, checks the opt-out, and pins both details above.

Thanks to xet7 !
2026-09-05 04:43:30 +03:00
Lauri Ojansivu 3a0dff12f6 Update upcoming WeKan changelog
Audited the section against git rather than against memory: every commit since
v11.49 is compared with the hashes linked here, and three had no entry.

  f72f361bb  the per-OS checkout paths - and, said plainly, that this same
             commit claimed all commits go on main, which the entry below it
             corrects in this same release
  77dd5f253  what opening History actually proved, and what it did not
  9b28c793f  the commit links repointed after a rebase made them stale

The only commits now without an entry are the "Update upcoming WeKan
changelog" ones themselves, which is how every earlier release reads.

The In short paragraph was describing the release as it stood several commits
ago - it opened on copying a list and did not mention the History panel or
Restore at all. It now leads with what the release is actually about and stays
inside the 120-word cap the format test enforces.

No new regression coverage was needed: the three entries added are
documentation commits with no behaviour of their own, and every behavioural
entry in the section already carries its tests.

Thanks to xet7 !
2026-09-05 02:48:35 +03:00
Lauri Ojansivu a3f1e8cdc9 Update upcoming WeKan changelog
Records the restore fix: the table shows a row's new content and Restore
applied its previous one, so picking a version gave you the one before it.

Thanks to xet7 !
2026-09-05 02:02:16 +03:00
Lauri Ojansivu 4286186a9d Restore the version you picked, not the one before it.
Reported as "when I try to restore card description from card history, it
restores wrong history, that I did not select" - and the selection was never
wrong. The server restored exactly the row whose checkbox was ticked. It
applied the wrong half of it.

A row carries two contents, before and after. The History table shows the
AFTER - History.md 7 says the content column holds "the new text" - and
Restore applied the BEFORE, because it reused the undo path: `applyRow(row,
'undo')`. So choosing the row that displayed the description you wanted handed
you the description from the row above it, and choosing rows one after another
walked backwards through the history instead of moving through it.

Restore now has a direction of its own. The rule is one sentence: the row a
reader picks and the value they get are the same thing. A row with no new
content is a removal, so restoring one puts back what it removed.

Undo is deliberately the other way round - Ctrl+Z reverses your own last
change - and is unchanged. The two only agree when the row you pick happens to
be the last one, which is why this survived the first pass: the live check
restored a title that WAS the most recent change, so undo and restore gave the
same answer.

The rule moved into `contentForDirection` in models/lib/changeHistoryGroups.js
so it can be tested as arithmetic, with no server and no database, and so
applyRow and the restore method cannot drift apart.

A restore is itself recorded, and those rows were wrong in the same way: they
repeated the restored row's own before/after, which describes a different
change. The live value is now read BEFORE the write and recorded as what was
displaced, so restoring FIRST over THIRD says so.

Verified against a running server: three description versions, FIRST, SECOND,
THIRD, with THIRD current. Picking the row showing FIRST set the description
to FIRST and logged THIRD -> FIRST; then picking SECOND set it to SECOND and
logged FIRST -> SECOND. Before this, picking FIRST emptied the description.

tests/historyRestoreAppliesWhatIsShown.test.cjs pins the rule from both ends -
what restore applies, and that the table shows that same content - along with
removals, additions and junk input. tests/changeHistoryWiring.test.cjs pinned
the old inline ternary by its text; it now runs the rule instead, which a move
like this cannot break.

Thanks to xet7 !
2026-09-05 02:02:01 +03:00
Lauri Ojansivu ac29ee5ffe Update upcoming WeKan changelog
Records the two faults inside the History panel: the collapsed stack entries
that grew when the container became a flex column, and the table whose
`width: 100%` produced a scrollbar with nothing to scroll at wide widths and
an unreachable overflow at narrow ones.

Thanks to xet7 !
2026-09-05 01:48:52 +03:00
Lauri Ojansivu 0c14b5a92e Drop the scrollbar that had nothing to scroll, and the empty band above search.
Both faults were inside the panel, which is why measuring its frame found
neither: the gaps around it were right the whole time.

THE EMPTY BAND ABOVE THE SEARCH BOX. `.content-container` holds the whole
popup STACK - one `.content` per entry, with the ones you are not looking at
collapsed by `.content.no-height { height: 0 }`. Making the container a flex
column turned those into flex items, and the growth rule applied to all of
them: `flex: 1 1 auto` says grow, and `height: 0` is only the basis it grows
from. So the card menu History was opened over stayed in the layout and took
336px of a 925px window. Only the entry being looked at grows now, and the
collapsed ones are pinned to `flex: 0 0 0 !important` - important because the
rule it has to beat, `.pop-over .content { flex: 1 1 auto !important }`,
carries one.

THE SCROLLBAR WITH NOTHING TO SCROLL. `width: 100%` on the table was wrong at
both ends, in opposite directions. Wide: WeKan's global `table, td, th` rule
gives the table a `border-inline-start: 1px` - those are the vertical lines
between the columns - and this file's reset makes `*` content-box, so 100%
sized the CONTENT and that border was added outside it. Columns summing to
993.047 in 993.047 of space, border box 994.047: one pixel of nothing, drawing
a bar across the foot of the panel at every width the table actually fitted.
Narrow: the table stayed at 100% while its columns needed 436px, so they
spilled OUT of it, and the scroll box measures the table rather than its
spill - the columns were unreachable, with a 1px scrollbar suggesting
otherwise. `width: max-content` sizes the table to what the columns want,
`min-width: 100%` keeps it filling the panel when they want less, and
`box-sizing: border-box` puts that 1px inside the 100%.

Two wrong turns are recorded in the comments because both looked right:
`border-collapse: separate` on the theory the 1px was a collapsed border (it
is not - the border is set explicitly by that global rule and survives), and
`box-sizing` alone, which removes the pixel by pinning the table to 100% and
so converts a real overflow into a hidden clip.

The gutter stays DESKTOP-ONLY. It was briefly made unconditional and that is
wrong: below 801px, and in mobile mode at any width, a popup is a full-screen
sheet flush to all four edges, and it should stay that way. The height chain
above it is NOT in a media query, for the opposite reason - the sheet still
has to pass its height down or the scrollbar ends up halfway up the panel. The
test now pins both directions, since they pull against each other.

Measured, desktop mode at 886x711: 10px on all four sides, no horizontal
scrollbar, 65px above the search box - the panel header and nothing else. At
375x812: edge to edge, and a horizontal scrollbar with 169px of real scrolling
instead of one pixel of none.

Thanks to xet7 !
2026-09-05 01:48:35 +03:00
Lauri Ojansivu f3c12bb428 Update upcoming WeKan changelog
Records the small-width half of the panel fix: the height chain that was
written desktop-only, the percentage heights that had no definite parent on a
full-screen sheet, and the two caps that ate the edges.

Thanks to xet7 !
2026-09-05 01:26:28 +03:00
Lauri Ojansivu 982a9473d6 Fill the History panel at small widths too, so the scrollbar sits at its foot.
Above 801px the panel already ended the same 10px from the bottom that it
starts from the top. Below that, where popup.css lays every popup out as a
full-screen sheet, it did not: the horizontal scrollbar sat halfway up the
panel with blank space beneath it, because nothing carried the sheet's height
down to the rows.

Measured at 375x812, three separate things were wrong, and all three were
percentage heights or caps that a diff cannot show:

THE CHAIN WAS DESKTOP-ONLY. The rules passing the height from the pop-over
shell to the template were written inside `@media (min-width: 801px)` - which
is exactly backwards, since above that width the panel is given a height
directly and below it the sheet is the only thing that needs help. Moved out,
and pinned there by a test that matches braces rather than looking for a
closing line: an earlier version of that guard searched for the next `\n}`
and a rule inside the block satisfied it, so it passed while the chain sat in
the media query it is meant to stay out of.

PERCENTAGES HAD NOTHING TO RESOLVE AGAINST. `.content-container` stopped at
588px - `max-height: calc(70vh + 20px)` from the base rule, whose
`.pop-over--bounded` override does not apply to a sheet because that class
comes from an inline max-height popupOffset.js does not send one of - and
`.content` collapsed to 10px, its `height: calc(100% - 20px)` resolving to the
padding alone. The chain is flex now, the whole way down: a flex item that may
grow and shrink needs no parent height, and `min-height: 0` is what lets it
shrink rather than being stretched by its own content.

AND TWO CAPS ATE THE EDGES. `.pop-over { max-height: 90vh !important }` left a
tenth of the screen empty under the sheet - 731px of 812. The mobile block
already tries to undo that and loses, having the same specificity and being
written earlier, so the override here carries the attribute selector and wins
on specificity instead. And this file's reset makes `*` content-box while
`.pop-over` has a 1px border, so the stated `calc(100vh - 20px)` drew 2px
taller than it says: 10px above against 8px below, at any width where
`.pop-over--bounded` happened not to be applied.

Verified in a browser at four sizes - 375x812, 768x1024, 886x711, 1280x720.
Under 801px the sheet fills the screen, as a sheet should; above it the gaps
are 10px on all four sides; and in every one of them the horizontal scrollbar
is at the foot of the panel.

The guard now strips CSS comments before matching declarations. It had started
passing on the comment that QUOTES `height: calc(100vh - 20px)` while
explaining it - prose satisfying an assertion about code.

Thanks to xet7 !
2026-09-05 01:26:13 +03:00
Lauri Ojansivu 2d4549dc11 Update upcoming WeKan changelog
Records the panel's geometry fix under the History group: the height, the
anchor margin that does not belong on a pinned panel, and the fixed
positioning a box sized from the viewport needs.

Thanks to xet7 !
2026-09-05 00:54:36 +03:00
Lauri Ojansivu 05d644f673 Give the History panel the same gap below it as above it.
The panel was pinned 10px below the top of the window and then stopped
wherever its contents ended: a two-row table sat in the top eighth of the
screen with the rest of it blank. It now ends 10px above the bottom, so the
space a reader sees under it is the space they see over it - measured at
1280x720: 10px on all four sides, a 700px panel, unchanged in RTL.

Three separate rules were needed and each was found by measuring rather than
by reading:

A HEIGHT. popupOffset.js already sent a max-height of the right size, and a
maximum alone lets a short table stay short. Stating `height: calc(100vh -
20px)` is what fills the window.

NO MARGIN. The base .pop-over adds `margin-top: 6px` - the little gap between
a menu and the button that opened it. These panels are not hung off a button;
popupOffset.js pins them to the viewport's 10px gutter, so the margin was
added to a position that was already final. Every full-width panel sat 16px
from the top while its own comment said 10, and on History, which now has a
stated height, it also pushed 6px past the bottom: 16px above against 4px
below. Zeroed for the export panels too, which have the same contract.

FIXED POSITIONING. Every other popup is absolute in DOCUMENT coordinates,
which is right for a menu that should travel with its button and wrong for a
box sized from the viewport. Opened on a page scrolled 53px down and then
scrolled back, the panel stayed at document y=63 - 63px below the window with
43px of itself past the bottom. It is positioned from the viewport now, like
the Admin edit popups above it, which solve the same problem the same way.

The height then had to reach the table, or the blank space would only have
moved indoors: the three wrappers between the pop-over shell and the template
pass it down, .history-main is a column so the rows take what the controls
leave, and .history-scroll grows instead of being capped at 55vh. With 40 rows
the panel stays 700px and the rows scroll inside it.

The offsets are logical rather than `left`, because tests/rtl.test.js rejects
physical ones - and both ends are named, since the template writes an inline
`left:` that a start-only rule would leave in force in RTL.

tests/historyOneTemplate.test.cjs pins all three rules and that the height
reaches the rows. The height assertion excludes `max-height` explicitly: it
matched a loose pattern and passed while testing nothing, which is the exact
state this commit fixes.

Thanks to xet7 !
2026-09-05 00:54:16 +03:00
Lauri Ojansivu 77dd5f2539 Say what opening History actually proved.
The previous commit verified the card scope. The rest has now been opened too,
so the document and the changelog say what was done rather than what was
likely: the card, list and swimlane menus each open the table with their own
scope reaching the template; search narrows it and reports no results for a
term nothing matches; a contributor's avatar filters to that person; and with
32 rows the footer reads 1 / 2, the second page holds the remaining seven in
sequence, and the next arrow disables itself there.

Nothing new was found. That is worth recording as plainly as the four faults
the first pass found, because "it shares a template with something that works"
is the reasoning those four faults survived.

Thanks to xet7 !
2026-09-05 00:20:05 +03:00
Lauri Ojansivu 731461eaea Update upcoming WeKan changelog
Records what opening History found, and corrects History.md, which still said
none of it had been exercised in a running WeKan. The card scope now has been:
what was verified, what the pass found, and - said plainly, because it is the
same reasoning that produced those four faults - which scopes remain untested.

Thanks to xet7 !
2026-09-05 00:16:35 +03:00
Lauri Ojansivu 92b5ce8614 Make History work when it is opened.
The change history and its table were written without a Meteor runtime
available, and both documents said so. Opening it found four things that no
amount of reading the source would have shown, three of which made the
feature useless.

THE TABLE WAS BLANK. `{{#each row in rows}}` binds `row` as a NAME and leaves
the data context alone - unlike `{{#each rows}}`, which replaces it - so
`{{_id}}`, `{{contentSummary}}` and the rest resolved against the OUTER
context and rendered nothing. Nothing errors: the table drew one row of four
empty cells and a checkbox with no id. Same bug in the contributor loop. Every
field now goes through its loop variable.

THE ROW COULD NOT BE SELECTED. WeKan hides every bare checkbox app-wide -
forms.css: `[type="checkbox"] { display: none }` - and draws `.materialCheckBox`
divs instead, so the real one here rendered 0x0. The row was visible, could
never be ticked, and Restore stayed disabled with nothing that could enable
it. It is now the control the rest of the app uses, clicked rather than
changed, drawn from the selection state.

THE PANEL WAS 380px WIDE. A popup's default width left 129px for the
contributor pane and 201px for a four-column table; the search box was
squeezed to 32px and one row had to be scrolled sideways to be read. History
is the same shape as the export panels - two panes, opened from a menu at the
edge of the screen - so it joins them in popup.css and in the FULL_WIDTH_POPUPS
list in popupOffset.js, which is the other half that decides where a panel is
placed. The rows also scroll in a wrapper now rather than in the table itself:
`display: block` on a <table> stops the cells sharing column widths, so the
header and the rows beneath it drift apart.

AND A RESTORE WAS RECORDED TWICE. This one is a correct decision with a
consequence: History.md 8.2 says a restore re-applies content through the
SAME setters an ordinary edit uses, so validation, hooks and Activities all
still run. The field-diffing after.update hook is one of those hooks, so it
saw the restore's own write and recorded it - and restoring a title left an
`edited` row nobody made sitting above the `restored` row describing the same
write. Recording, and only recording, is now switched off for the duration of
the applier.

That switch is an AsyncLocalStorage scope, not a module-level boolean, and the
difference is not stylistic: the server handles several requests at once, and
a shared flag set during one user's restore would have silently swallowed
another user's edit landing in the same window - a data-loss bug that appears
only under concurrency and would never be seen in testing.

Verified against a running server rather than by reading: a card renamed
through the UI recorded one row with the right group, previous and new value;
History showed it; selecting it and pressing Restore put the title back and
left exactly two rows, the edit and the restore.

tests/historyOneTemplate.test.cjs pins the loop-variable rule, the checkbox
control, the panel width in both files that decide it, and the scroll wrapper.
tests/historyRestoreRecordsOnce.test.cjs pins the suppression, that a restore
still writes through the normal setters, and - running two overlapping async
operations for real - that a concurrent edit by another user is still
recorded.

Thanks to xet7 !
2026-09-05 00:15:18 +03:00
Lauri Ojansivu 15dd4afd46 Update upcoming WeKan changelog
Records the three commits that had no entry yet - the moment import that
broke the client build, the ignore files being brought to one answer about
what is not source, and the corrected note about what ignoring .build does.

Also puts the release's subsections in the order the house style asks for.
The Undo and History work sat under "and states the rules a contribution is
judged by", which was written for the Contributing group below it; the
feature now has its own "This release adds the following new features:"
header, the swimlane fixes follow as bugs, and the tooling fixes close.

Thanks to xet7 !
2026-09-04 23:58:32 +03:00
Lauri Ojansivu 66e8420bec Say what ignoring .build does, and stop claiming what it cannot do.
The comment beside /.build/ in .meteorignore said the entry was Meteor's
"The output directory is under your source tree" warning "answered". It is
not, and the warning printed on the very next build says so.

That warning is a path comparison on the output ARGUMENT, made before any
file is written: tools/cli/commands.js asks whether
pathRelative(appDir, outputPath) starts with '..' and prints it when it does
not. No ignore file is consulted and none can reach it. Silencing it means
building outside the tree, which build.sh, build.bat and the release
workflows would all have to agree on.

What the entry does is the second half of the same warning - "may get
interpreted as source code". Without it the next `meteor run` walks a whole
bundled copy of the app, so it is worth having on its own merits, which is
what the comment now says.

tests/meteorignoreScanScope.test.cjs pins both directions, one character
apart: _build must NOT be ignored (it is the handoff Meteor reads its
mainModule from) and .build must be, and the false claim cannot come back.

Thanks to xet7 !
2026-09-04 23:57:16 +03:00
Lauri Ojansivu 7290ed0360 Say what _build is, and ignore what is not source in every ignore file
Two build directories exist and their names are one character apart, which is
how one of them got scanned as source by a test earlier today:

  .build/  the RELEASE bundle, from `meteor build .build --directory`.
           .build/bundle is what is deployed, tested and packaged.
  _build/  rspack's compiled output, written by ANY Meteor compile. Meteor reads
           the app's main modules from _build/main-prod/, so it is a HANDOFF,
           not a leftover - which is why .meteorignore must NOT ignore it, as
           the note in that file has said since the Meteor 3.4 migration.

Both are now described where somebody meets them: the build.sh and build.bat
headers, Directory-Structure.md, Build-from-source.md, Meteor-bundle.md,
Build-and-Create-Pull-Request.md (as "what not to add to a pull request"), and
CLAUDE.md/AGENTS.md - the last with the warning that _build holds a bundled
second copy of every source file, so anything walking the repository must skip
it. That is not hypothetical; a source-scanning test read it and reported the
bundler's rewritten imports as a source file breaking a rule.

_build was in .gitignore and .meteorignore only. It is now in .dockerignore,
.eslintignore and .prettierignore too.

The same pass aligned the rest. Nothing in client/, server/, models/, imports/,
config/ or packages/ imports anything from docs/, meta/, old-CHANGELOG/,
openapi/, sandstorm-src/, snap-src/, snap-base-debian/, stacksmith/, releases/,
scripts/, tools/ or secrets/ - checked, not assumed - so Meteor no longer
watches them. It watches what it does not ignore, one inotify watch per
directory, against a per-user limit shared with every other watcher on the
machine: the same limit .tools/ was added for. The Docker context no longer
carries them either, since everything in it is sent to the daemon whether the
image uses it or not.

Four things are deliberately NOT ignored, each for a reason now written down:
config/ is imported by the app in nine places; private/ and public/ are Meteor's
own asset directories; packages/ holds the local Meteor packages; and _build/
breaks the build if ignored. releases/ stays in the Docker context because the
Dockerfile COPYs several scripts out of it.

.meteorignore now also ignores .build/, which answers a warning Meteor prints on
every release build - "The output directory is under your source tree. Your
generated files may get interpreted as source code!" Unlike _build/, nothing
hands .build/ back to the compiler; it is finished output read by the deploy and
test steps.

Thanks to xet7 !
2026-09-04 23:47:14 +03:00
Lauri Ojansivu 9dc2c5cf9a Use the date helper WeKan has, not the one it removed
The client build failed outright:

  ERROR in ./client/components/history/historyTable.js
    × Module not found: Can't resolve 'moment'

moment was removed from WeKan and replaced with native Date functions -
imports/i18n/moment.js says exactly that - so it is not a dependency and nothing
resolves it. The History table now uses formatDateTime from
/imports/lib/dateUtils, which is what the rest of the app uses.

`import moment from 'moment'` is the most ordinary-looking line in a JavaScript
file, and reading the diff would never have shown it, because what was wrong was
somewhere else entirely: the dependency list. So the guard is worth more than
the fix. tests/importsResolve.test.cjs asks the question the bundler asks - can
this specifier resolve, against the real node_modules - across client, models,
imports and server. It finds this class in under a second where `meteor build`
takes two minutes, which is the difference between noticing while writing a file
and noticing after handing the work over.

It also pins the two packages the app imports directly without declaring,
body-parser and mime-types. Those resolve today only because something else
pulls them in, and would vanish if that dependency changed; the list is pinned so
it cannot quietly grow, not because it is fine.

Two more things the build turned up, both about scanning generated files:
tests/undoRecordsWhatItClaims.test.cjs walked into _build/, the bundled copy of
the whole app, and reported the bundler's own rewritten imports as a source file
breaking the import rule. Build output is skipped now.

And the failure count this suite reports has been wrong all along, in the
other direction: 18 "pre-existing failures" were mostly modules that were simply
not installed in this checkout. With dependencies present the suite runs 718
suites with 5 failures, and those 5 are real environment limits - no Docker, no
bundle to boot, macOS bash without globstar.

Thanks to xet7 !
2026-09-04 23:34:09 +03:00
Lauri Ojansivu 4a14cbca38 Update upcoming WeKan changelog
Thanks to xet7 !
2026-09-04 23:20:41 +03:00
Lauri Ojansivu 1fe46c6044 Record every group, and give History one table for every scope
Phases 3, 5 and 6 of docs/Features/Reports/History/History.md, and the viewer of
phase 2.

RECORDING EVERYTHING, FROM ONE PLACE. §5 suggests "a thin, central choke point
... avoids sprinkling calls everywhere", and server/models/changeHistoryHooks.js
is that: an after.update hook per collection that diffs the changed fields, plus
insert/remove for the sub-entities. Cards, lists, swimlanes, checklists,
checklist items and comments are covered across every group §3 names.

The advantage over editing twenty setters is not brevity, it is COVERAGE: the
REST API, the CSV and Trello importers and the rules engine all write through
the collection and none of them call the client setters, so a per-setter rollout
would have recorded a description edited in the UI and silently missed the same
edit made over the API.

What a hook must not do is record too much, so models/lib/changeHistoryGroups.js
is a table rather than a rule: modifiedAt and dateLastActivity change on nearly
every write and would bury the changes a person actually made, and the four
fields of a move only mean anything together - reported separately, one drag
becomes four rows and undo puts back a quarter of it. Card.move and the list
soft delete therefore record themselves, as one change each. The description
setter records nothing now: the hook covers it, and recording in both places
would have needed two presses of Ctrl+Z to undo one edit.

ONE TABLE, EVERY SCOPE. §7a: "there is ONE implementation, parametrised by
scope". client/components/history/historyTable is that one - contributor pane,
search, pagination, row selection, Restore, RTL - and the card, list and
swimlane menus each open it with a different scope. Adding History to a menu is
a menu item and a two-line handler, exactly as the design promises.

tests/historyOneTemplate.test.cjs keeps it that way. Six copies of a table
drift: one gets RTL and the others do not, one gets the search fixed and the
others keep the bug. The test walks every .jade under client/ and fails if a
second History table is ever defined.

Two things the UI needed that were nearly wrong. The scope has to travel as
`dataContextIfCurrentDataIsUndefined`, because Popup.open's second argument is
OPTIONS - a bare object there is ignored and the popup opens on the menu's own
data context, showing the wrong history. And the popup needs a title key or it
renders with no header and no close button; it reuses the existing `history`
key rather than adding one.

FOUR NEW WORDS. Removed, Edited, Moved, Restored - the Action column is the one
a reader must understand. 'Added' the app already had, and every other label
reuses the word the card view already uses for that section, so a group is
labelled Description or Labels in the language the card beside it speaks. That
kept this to four keys in 197 locales instead of twenty-six. Low confidence on
the same long tail as before.

NOT VERIFIED LIVE. There is no Meteor runtime here, so none of this has been
opened in a browser. §10 asks for each phase to be verified live before the
next; that has not happened, both documents now say so, and the UI in
particular should be treated as unproven.

Thanks to xet7 !
2026-09-04 23:20:12 +03:00
Lauri Ojansivu 985c0f43be Update upcoming WeKan changelog
Thanks to xet7 !
2026-09-04 22:57:29 +03:00
Lauri Ojansivu 898643eea9 Build the universal change history, and put undo on top of it
Phase 1 of docs/Features/Reports/History/History.md §10, plus the write half of
phase 2. Ctrl+Z is no longer a position-only feature.

THE STORE. models/changeHistory.js is the append-only collection of §4: one row
per change, carrying every container id it sits inside (boardId, swimlaneId,
listId, cardId) so a container scope is a plain equality rather than a join the
database cannot do - which is what makes a swimlane's history include its lists'
and cards' rows.

It imports NO other model, deliberately. Its predecessor imports Cards, Lists,
Swimlanes, Checklists and ChecklistItems so its undo() can write to them, and
that is precisely why models/cards.js could not import it, guarded on an assumed
global instead, and recorded nothing for years. A collection that entities must
import cannot import entities. Applying a change back to a document therefore
lives in server/models/changeHistory.js, which nothing imports and which may
import anything.

THE RULES ARE PURE. models/lib/changeHistoryQuery.js holds the scope-to-selector
translation, the search and the selection normalisation, with no Meteor and no
database, because that is where this feature is either right or quietly wrong:
a scope that resolves to the wrong id column shows one board's history under
another board's menu, and a selection that does not normalise its input restores
the wrong rows. Both are silent. 17 tests, including that an unknown or
half-given scope is REFUSED rather than widened into a selector that matches
everything.

UNDO IS NOW THE WHOLE HISTORY. changeHistory.undoLast/redoLast replace the
position-only methods; the keyboard bindings and the tested pickUndo/pickRedo
rule are unchanged. One rule covers every change type instead of a case per
action: undo applies previousContent, redo applies newContent. Restores go
through the same setters an ordinary edit uses, so validation, hooks and
Activities still run, and each restore is itself recorded twice - once
attributed to whoever made the change being restored, once to whoever pressed
Restore (§8.3).

RECORDED SO FAR: card description edits (§10.2's first content group - the
previous text is read BEFORE the write, since after it the old value is gone),
card moves, list moves, and list soft-delete/restore, which is what makes
"undo a deleted list" work.

changeHistory is in the snap's MERGE_COLLECTIONS, as §9a.4 requires the moment
the collection exists: a history row written on the copy that is not served is
work that would otherwise be stranded in a database nobody opens.

NOT BUILT: every UI in §7, §7a and §8 - the popup, the table, the contributor
avatars, the Restore button, the "History" menu items - and recording for the
remaining groups of §3. The methods those screens need exist and are tested;
nothing calls them yet. Both docs now say which half is which, because the last
time this document claimed more than the code did, the gap survived for months.

Thanks to xet7 !
2026-09-04 22:56:52 +03:00
Lauri Ojansivu ece96c2479 Update upcoming WeKan changelog
Thanks to xet7 !
2026-09-04 21:43:42 +03:00
Lauri Ojansivu dc4110e6fe Record card moves in history, so undo of a drag does something
Ctrl+Z after dragging a card did nothing, and had never done anything.

#6478 found that every trackChange call site guarded on

  typeof UserPositionHistory !== 'undefined'

against a bare identifier no file imported. It is an ES-module default export,
not a global, so the guard was always false and nothing was ever recorded. The
fix - import the collection - was applied to the list path in
server/models/lists.js and NOT to the card path in models/cards.js, which kept
the dead guard. So list moves became undoable, card moves did not, and
docs/Features/Login/Undo/Undo.md said card moves were "already present (now
actually runs)" the whole time.

The import here has to be lazy and has to be inside the call:
models/userPositionHistory.js imports models/cards.js, so a top-level import
would be a cycle and could leave the binding undefined depending on evaluation
order. That is the same shape as the cardMoveModifier require a few lines above,
and is most likely why the file was skipped rather than fixed.

The guard is gone from the list path too. It was harmless there - that file does
import the collection, so it was always true - but it is the shape that turned
recording off, and copying that block into a file without the import silently
turns it off again. Which is exactly how the card path stayed dead.

tests/undoRecordsWhatItClaims.test.cjs is the guard the fix needed more than the
fix itself, because undo FAILS SILENTLY: nothing throws when a change is not
recorded, the user just presses Ctrl+Z and nothing happens. It finds the
recording sites rather than listing them, and fails when one cannot reach the
collection, when one reintroduces the assumed-global guard, when recording is
not wrapped so it can never fail the move it records, and when an entity type is
recorded that undo() has no case for. It also pins the reverse gap - swimlane,
checklist and checklistItem have full undo() cases that nothing records - so
that stays a known follow-up rather than a surprise.

Undo.md no longer claims more than the code does, and now says plainly what is
recorded (list moves, list soft-delete/restore, card moves) and what is not
(everything else - a description, a checklist title, labels, members, dates are
written straight to the document with no previous state kept).

Thanks to xet7 !
2026-09-04 21:43:00 +03:00
Lauri Ojansivu 35161571c0 Update upcoming WeKan changelog
Repoint one commit link and add the contribution-rule entries.

The link is the interesting half. The copy-a-list entry pointed at
d80806abd4c5777646c6dff70c54b2fd3f4b0f7a, which exists in this clone and
nowhere else: it is reachable only from refs/heads/claude/zen-bhabha-b18b7f, a
local worktree branch that was never pushed. The same change is on main as
97fcf364c - identical patch-id - and that is the hash GitHub can serve, so that
is the one the entry links now.

releases/fix-changelog-hashes.sh left it alone, and correctly by its own rule:
a link is fine when its commit is reachable from ANY ref in this clone, because
a commit that is only in an old release tag is still served perfectly well. A
local worktree branch passes that test and is not served at all. It reported
"Repointed 1 of 2" rather than claiming both were fine, which is what made it
findable.

Thanks to xet7 !
2026-09-04 21:34:07 +03:00
Lauri Ojansivu 9b28c793f7 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-04 21:29:32 +03:00
Lauri Ojansivu bbfc139b72 Say where the maintainer's AI is credited: the sponsors page, and only there
The attribution rule said an AI working for a human is invisible, which read as
"never acknowledged anywhere". It is acknowledged - once, deliberately, in one
place - and a rule that omits the exception invites somebody to add the credit
back where it was removed from.

It lives at https://wekan.fi/sponsors , under "AI donated by. All code and PRs
verified by xet7", where Claude, Codex and GitHub Copilot sit alongside the
people and companies that donate hosting, servers, grants and testing. That is
the whole of the credit, and the reason it is there rather than in the commits
is that a per-commit trailer put the same fact on thousands of lines and drowned
out the humans the entries exist to name. Moving it to the page that says who
gives WeKan what is what fixed that, so acknowledging it anywhere else is not
extra politeness - it undoes the fix, and both files now say so in those terms.

Maintainer mode carries the same pointer, since that is where an AI is most
likely to feel a commit is unattributed and reach for a trailer. CODE_OF_CONDUCT
carries it in its own plain register, next to the two rules it already gained.

Thanks to xet7 !
2026-09-04 21:29:32 +03:00
Lauri Ojansivu ac18670360 Credit the AI that opened a pull request, never the one that helped a human
"Never attribute a commit to an AI" was one rule where there are two, and it
gave the wrong answer to half the cases it met.

The test is whether a person is behind the change, not whether an AI touched it:

  a human's AI  -> invisible. The maintainer or a contributor using Claude
                   Code, Codex, Copilot or any other model is the author; the
                   tool appears nowhere - no Co-Authored-By trailer, no
                   "Generated with", no model name in the commit, the pull
                   request body or the CHANGELOG.
  an AI on its  -> the contributor, named. GitHub CodeQL raising a fix for
  own             something it found, Copilot Autofix, Dependabot: no human
                  wrote those, so crediting a human would be false and
                  crediting nobody would leave the change unattributed.

So the same word - "Copilot" - is forbidden in one commit and required in
another, and this now says which is which instead of leaving it to be guessed.
The second half is not new practice: the dependency sections have always closed
with "Thanks to dependabot.", and the Hall of Fame has always named GitHub
CodeQL as a reporter. Those were the rule being followed without being written
down, and that bullet now says why the bot is credited there.

Maintainer mode also now says the thing it only implied: the AI ITSELF makes the
commit, directly on main, authored Lauri Ojansivu <x@xet7.org> - not as a
co-author, not as a second author, but as that author and no other. Contributor
mode gains the case where the contributor IS an AI, which is still a branch and
a pull request; what differs is that the pull request names it.

CODE_OF_CONDUCT.md carries the same rule, in its own plain register, because it
is where a contributor looks first and it was the document being cited for the
half that was written down. The sentence CLAUDE.md quotes from it is unchanged,
so that citation still reads true.

Thanks to xet7 !
2026-09-04 21:29:32 +03:00
Lauri Ojansivu c873972671 Say plainly which of the two roles commits where
The previous commit got the contributor half wrong. It read the "commits go
directly on main" rule as applying to everyone, and rewrote contributor mode to
match - so the file told somebody with no write access to wekan/wekan to commit
on main, and dropped the pull request that is the only way their work can
actually arrive.

There are two roles and two answers, and the file now leads with both in a table
rather than leaving either to be inferred:

  the maintainer, Lauri Ojansivu <x@xet7.org>  -> directly on main, never a
                                                  branch, never a pull request
  a contributor, anybody else                  -> a branch in their own fork,
                                                  then a pull request, never a
                                                  commit on main

Each half is given its reason, because a rule with a reason survives a tool that
offers something else. The maintainer's is the release flow: release-all.sh cuts
a release from whatever is on main, so work parked on a branch is work that
misses it. The contributor's is review: nobody else commits to main in
wekan/wekan, so a change from anyone else arrives as a pull request, which is
also the only place it can be discussed first.

Contributor mode is back to what it said before, and the two later places that
had been reconciled the wrong way - the General practices bullet and the
directory-structure entry - now say the same thing as the table. The never-push
boundary is unchanged and applies to both roles: an AI makes the local commit
and stops, whether that commit is on main or on a contributor's branch. Pushing
it and opening the pull request are the human's.

Thanks to xet7 !
2026-09-04 21:29:32 +03:00
Lauri Ojansivu f72f361bb3 Say that commits go directly on main, and where the checkout is
Two things an agent had to infer and could get wrong.

WHICH BRANCH. Every commit goes directly on main - not a feature branch, not a
topic branch, never a pull request - and the reason is the release flow rather
than taste: releases here are frequent, releases/release-all.sh cuts one from
whatever is on main taking its version from the Upcoming section of
CHANGELOG.md, and work parked on a branch is work that is not in the next
release. An agent harness that offers to branch the work off, or to run it in
its own git worktree, is offering exactly the thing that strands it: a worktree
cannot be on main, because git allows one checkout per branch, so its work
belongs back on main before it is committed.

WHERE. The checkout is at a fixed place per operating system - ~/repos/wekan on
Linux, ~/Documents/repos/wekan on macOS, Downloads\repos\wekan on Windows - so
"the WeKan repo" no longer means "wherever you happen to be".

Both files were already identical apart from their first three lines, and still
are. Two places contradicted the new rule and were reconciled rather than left
to be discovered: maintainer mode said "the current branch" where it meant main,
and contributor mode said to work on a branch and open a pull request. A
contributor commits on main too - what differs is the author and that no release
step is theirs to run - and how the work then reaches wekan/wekan is a human
step, which the never-push boundary at the top already keeps out of an agent's
hands. That boundary is unchanged: committing directly is not permission to
push, in this repository or in any of the companion ones under .tools/, which
follow the same rule on their own default branch (main-v1 for the FerretDB fork,
devel for TSC).

Thanks to xet7 !
2026-09-04 21:29:32 +03:00
Lauri Ojansivu 23447f3c2b Update upcoming WeKan changelog
Thanks to xet7 !
2026-09-04 21:29:31 +03:00
Lauri Ojansivu 290cdc6a4d Restore lost list swimlanes from Admin Panel / Problems
Boards opened under the versions before #6515 had every per-swimlane list
un-bound automatically: the board data-repair treated any list with a
swimlaneId as #6484 corruption and cleared it, and a per-swimlane list is
indistinguishable from a corrupted board-wide one at the data level. #6515
stopped it. Nothing put the bindings back, so those lists still render under
every swimlane, and deleting one from a swimlane deletes the only list document
there is - which is what #6670 reports.

The old value is recoverable, not guessable. That clearing went through
Lists.direct.updateAsync, which bypasses collection hooks, so it only ever
touched the list document - while the binding each list was CREATED with is
recorded in a different collection:

  // models/lists.js - Lists.after.insert -> trackOriginalPosition()
  originalSwimlaneId: this.swimlaneId || null,
  if (!existingHistory) { PositionHistory.insertAsync(document); }

That insert is insert-ONLY, written once at creation and never overwritten, so
it survived untouched for every list created since list position tracking
landed (2025-10-16, 2543df942).

Admin Panel / Problems / Summary now detects this the way it detects broken
cards - "Lists missing their swimlane N", with a Restore button beside it -
and restoring puts each list back in the swimlane its own record names.

Every rule is a reason to SKIP, because the failure mode here is worse than
doing nothing:

  - a list that already has a swimlaneId is never touched, so the repair is
    idempotent and cannot undo a binding an admin has since set by hand;
  - a list with no record, or one recorded as board-wide (null), stays
    board-wide;
  - a swimlane that has since been deleted is not resurrected, and one on
    another board is refused - either would hide the list in every swimlane,
    which is worse than leaving it shared.

Nothing is inferred from the cards, and a test pins that the planner cannot
grow a use for them. Inference is the obvious idea and it is wrong: on a board
whose second swimlane is new every card is still in the first one, so it would
bind every list to swimlane 1 and hide them from the others - #6484 again,
the bug the clearing existed to fix.

Detection is read-only and swallows its own errors, because the Problems page
polls it every 30 seconds and a detection that throws would take the other
problems on that page with it. The repair writes swimlaneId and nothing else,
through .direct, one update per swimlane rather than one per list.

One new string, translated into all 197 locales that were complete, each
following that file's own "Repaired __fixed__ card(s)." sibling so the count
style and script match what the language already uses here. Low confidence on
the long tail - Bislama, Buryat, Cherokee, Ewe, Fijian, Greenlandic, Inuktitut,
Klingon, Nahuatl, Sakha, Tamazight, Venda, Volapük, Wolof - which a speaker
should correct. Noted while writing them: the `lists` value is wrong-language in
mn (Russian), sk (Czech), sr and wa-RR (Tagalog); not touched here.

Also fixed a guard that the parallel worktree exposed:
tests/noIdentityReplacement.test.cjs walked into .claude/worktrees/, a full
second checkout, and reported the deliberate samples in ITS copy of that test
file as real findings.

Thanks to TawsTm and xet7 !
2026-09-04 21:29:31 +03:00
Lauri Ojansivu 2296cbf49e Update upcoming WeKan changelog
Thanks to xet7 !
2026-09-04 21:29:31 +03:00
Lauri Ojansivu 97fcf364c6 Copy a list into a new list, with all of its cards
Thanks to xet7 !
2026-09-04 21:29:31 +03:00
github-actions[bot] aa9b657f58 Bump versions for v11.49 2026-09-04 17:14:12 +00:00
Lauri Ojansivu 55f1071929 Prepare v11.49 release 2026-09-04 20:13:13 +03:00
Lauri Ojansivu b7fe07fcae Update upcoming WeKan changelog
Thanks to xet7 !
2026-09-04 19:26:49 +03:00
Lauri Ojansivu fb53390756 Bind a list to the swimlane it is moved to
Moving a list to another swimlane on the same board did nothing: the list kept
its empty swimlaneId, so it went on rendering under every swimlane, and
deleting "the one in the second swimlane" deleted the only list document there
was. Backups showed the empty swimlaneId the report describes.

List.move(boardId, swimlaneId) asked "does the target board already have a list
with this name?" without first asking whether the target board IS this list's
board:

  const boardList = await ReactiveCache.getList({
    boardId, title: this.title, archived: false });
  if (boardList) { ...merge, never writes a swimlaneId... }
  else           { ...insert a new list WITH the swimlaneId... }

On a same-board move that search finds THIS LIST, so the merge branch ran - and
the merge branch is the one branch that never writes a swimlaneId. The chosen
swimlane was discarded every time, which is why the binding could not be
restored by hand either.

Merging is only meaningful across boards. On the same board a move is a
re-bind, so that is what it does now. The decision lives in
models/lib/listMovePlan.js, where it can be unit-tested, and models/lists.js
applies it: same board -> rebind this list, other board with the name taken ->
merge the cards into that list, other board -> create it there, bound. An empty
swimlaneId stays a deliberate un-bind back to board-wide, which is still a
legitimate layout. moveList now also refuses a swimlane that is not on the
board the list is moving to.

The same branch called `card.move(boardId, this._id, boardList._id)`, and
Card.move's second argument is a swimlaneId - so it set every card's swimlaneId
to a LIST id, i.e. to a swimlane that does not exist, and those cards became
the orphaned cards the board-open repair then has to rescue. The cards were
also selected as `this.cards(swimlaneId)`, filtering the SOURCE list's cards by
a swimlaneId belonging to the TARGET board, which on a cross-board move matches
nothing and left every card behind. Both are gone: the list's own cards travel
with it, into the chosen swimlane.

A negative test scans models/lists.js for any card.move() whose second argument
is not a swimlane, so this cannot come back at another call site - it found the
argument order was wrong in only this one place, and the scan now ignores
comments so the explanation of the fix does not trip it.

This does not restore bindings already lost. Boards opened under the versions
before #6515 had every list un-bound automatically, and which swimlane each
list belonged to is not recoverable from the data; with this fix that binding
can at least be set again from Move List.

Thanks to TawsTm and xet7 !

Fixes #6670,
2026-09-04 19:26:03 +03:00
Lauri Ojansivu 786ad95def Updated translations. 2026-09-04 19:13:57 +03:00
Lauri Ojansivu 2da9f191fa Update upcoming WeKan changelog
Thanks to xet7 !
2026-09-04 16:45:38 +03:00
Lauri Ojansivu c048f7ecef Trim the native prebuilds the target can never open
bcrypt and argon2 (Meteor's accounts-password) each ship one
prebuilds/<platform>-<arch>/ directory per platform they support: 21 native
binaries in every WeKan bundle, of which exactly one is ever opened. Their
loader is node-gyp-build, and its resolve() reads a single directory:

  var tuples = readdirSync(path.join(dir, 'prebuilds')).map(parseTuple)
  var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0]

with platform and arch from os.platform() and os.arch(). This is the same
argument bundle-trim.mjs already makes about uWebSockets.js, so it is the same
code path: --trim-prebuilds keeps the directories node-gyp-build would match
and drops the rest. The tuple parsing here IS node-gyp-build's, multi-arch
names ("darwin-x64+arm64") included, and both libc flavours of the target are
kept because glibc versus musl is decided at runtime.

Three things make it safe rather than merely smaller, and all three are pinned
by tests:

  - It is off by default and REFUSES to run without an explicit --platform and
    --arch. The defaults are linux/x64, and a Windows or macOS bundle trimmed
    with those would lose the only addon it can load, which is precisely the
    fault the single EXE was just fixed for.
  - build-amd64 does NOT pass it. Every other bundle WeKan ships is that bundle
    repacked, so trimming there would take the prebuilds away from
    architectures that have not been built yet. Each final per-platform job
    passes its own target instead.
  - Every decision is made before anything is deleted, so a package whose
    prebuilds cannot be reasoned about is left whole rather than half-trimmed.
    Running it on a real bundle found bare-fs, bare-path and bare-url, which
    ship prebuilds/ of .bare files for the Bare runtime - a different loader
    with different rules. Those are left untouched, and say so.

On the mac-arm64 bundle: 19 of the 21 removed, the two for darwin-arm64 kept.
For the single Windows EXE that takes the files it has to unpack from 33 down
to about fifteen.

Two tests were counting a script named in a YAML comment as a script the job
runs, which the new comments in build-amd64 tripped. Both now drop comment
lines before looking, which is what they meant in the first place.

Thanks to xet7 !
2026-09-04 16:41:41 +03:00
Lauri Ojansivu c1ca236df5 Update upcoming WeKan changelog
Thanks to xet7 !
2026-09-04 16:17:18 +03:00
Lauri Ojansivu 35cf025f07 Run the Windows single EXE from the archive instead of unpacking it
The EXE unpacked its whole bundle - 39,035 files, 685 MB - beside itself on
first run. It does not any more. It unpacks only what cannot be virtual, and
the server reads the rest out of the EXE in its own process.

What cannot be virtual, and why: node.exe and ferretdb.exe are separate
processes, so Windows needs a real path to start one; .node addons are loaded
with LoadLibrary, same reason; main.js is the entry Node resolves before any
hook could see it; start-wekan.bat is read by cmd.exe; and wekan-vfs.cjs is
read by node --require before anything is mounted. main.js also chdir()s into
programs/server, and a working directory is a kernel concept no hook can
answer, so that one directory is created for real. That is about thirty files
out of 39,035. releases/append-windows-payload.mjs --manifest computes the
list from the archive and writes it as a C header the launcher includes, so a
bundle that gains an addon or a database tool cannot silently lose it.

The mount itself is releases/single-exe/wekan-vfs.cjs. It needs two
mechanisms, because Node needs both:

  - module.registerHooks() for require(). Node's CJS loader resolves through
    internal C++ bindings, so patching fs cannot make require see a virtual
    file, and Module._stat is captured as a module-local inside
    Module._findPath, so replacing it does nothing either. Resolution is
    therefore reimplemented here - and checked against Node's own answer for
    every package in a real bundle: 1407 package directories and 1865 bare
    specifiers, all matching.
  - fs patching for everything that is not a module. Meteor's boot.js reads
    program.json and every server package with fs.readFileSync and runs them
    through vm.runInThisContext, and webapp serves the client files with
    fs.createReadStream.

And one thing below both: Meteor's runtime.js hands reify a resolver that
calls Module._resolveFilename directly. registerHooks sits above that call and
never sees it, so that layer is patched too.

Two traps, both hit while building this. A .node addon must be resolved with
NO format declared: saying "commonjs" for one makes Node compile the binary as
JavaScript and die with "SyntaxError: Invalid or unexpected token" on its own
header - the 11.48 crash reproduced from the other side. And a directory that
exists both really and in the archive has to merge both listings, or
wekan-app/programs/server would list the two unpacked files and hide the
entire server.

Verified end to end on a real bundle rather than by reading: with 23 real
files on disk and 38,931 served from the ZIP, WeKan boots, connects to
FerretDB and answers 200 on /sign-in and on its 6.9 MB client bundle. The
release smoke test now also counts what reached the disk, so a change that
quietly went back to unpacking everything fails the job instead of passing it.

Thanks to xet7 !
2026-09-04 16:16:15 +03:00
Lauri Ojansivu 286e0567bd Update upcoming WeKan changelog
Thanks to xet7 !
2026-09-04 13:13:58 +03:00
Lauri Ojansivu a12cc8142e Unpack the Windows single EXE instead of virtualising it
WeKan-11.48-win64.exe died on every start with a SyntaxError in
accounts-password's bcrypt/promises.js, whose first line read "MZ...This
program cannot be run in DOS mode." - the bytes of a PE file, not of the
1123-byte JavaScript file that is really there. Both published files were
correct: the win64 ZIP holds the real promises.js, and so does the EXE. In
its packed image bcrypt.node (195584 bytes) is entry 0x5c9c and promises.js
is 0x5c9d, stored back to back, each with the right bytes at its recorded
offset. What was wrong was the READ. Enigma Virtual Box served all 44,401
bundle files from a virtual filesystem inside the EXE, and once Node.js had
loaded the native addon out of it (bcrypt.js line 2), the next read -
require('./promises') on line 6, the blob immediately after that addon -
came back as the addon's own PE bytes.

So the packer is gone. The EXE is now the compiled launcher with the
published ZIP appended to it and an 80-byte trailer saying where that
payload starts, how long it is, its SHA-256 and which WeKan it is. On its
first run the launcher checks that SHA-256, unpacks the payload into a real
"wekan-app" directory beside itself with Windows' own tar.exe, and from
then on WeKan runs from ordinary files. Persistent data is untouched by
any of it: wekan-files stays a sibling, so unpacking a newer version never
reaches it. The download drops from 690 MB to about 232 MB, and a damaged
copy now stops at a checksum with a message instead of reaching Node.js as
a crash loop.

The workflow's smoke test is why this shipped at all. start-wekan.bat
restarts WeKan every three seconds, so a crash-looping EXE still answered
on port 8080 inside the poll window and the job went green. It now starts
the EXE twice - the run that unpacks and the run that must find wekan-app
already there - and fails on "WeKan exited; restarting" or "SyntaxError"
in either log.

Thanks to xet7 !
2026-09-04 13:11:24 +03:00
Lauri Ojansivu 04d1dbbe40 Updates 2026-09-04 12:30:24 +03:00
Lauri Ojansivu d6e9266acf Added Hostinger 2026-09-04 12:16:57 +03:00
github-actions[bot] 0f41341fcd Bump versions for v11.48 2026-09-03 23:04:53 +00:00
Lauri Ojansivu cb236b5a27 Prepare v11.48 release 2026-09-04 01:58:49 +03:00
Lauri Ojansivu 5c3ae64e0b Update upcoming WeKan changelog 2026-09-04 01:57:48 +03:00
Lauri Ojansivu 9d582fc055 Match custom fields layout icon color 2026-09-04 01:54:12 +03:00
Lauri Ojansivu 50efbd496f Simplify custom fields layout icon 2026-09-04 01:52:54 +03:00
Lauri Ojansivu 3b64bada4e Raise header Add Board button 2026-09-04 01:49:14 +03:00
Lauri Ojansivu a935f84adf Show only active layout mode icon 2026-09-04 01:46:31 +03:00
Lauri Ojansivu 7f6d730356 Keep active mode toggle icon white 2026-09-04 01:45:01 +03:00
Lauri Ojansivu 72d7c0884e Remove mobile mode toggle frame 2026-09-04 01:38:43 +03:00
Lauri Ojansivu 0bf5b7bdae Remove starred header group border 2026-09-04 01:36:48 +03:00
Lauri Ojansivu f7ca17916a Remove custom fields layout toggle frame 2026-09-04 01:33:46 +03:00
Lauri Ojansivu 003c7b09c6 Update upcoming changelog for isolated browser tests 2026-09-04 00:17:59 +03:00
Lauri Ojansivu e8de8ca564 Isolate browser report and width tests 2026-09-04 00:17:30 +03:00
Lauri Ojansivu 7f077c6373 Update upcoming changelog for browser test fixes 2026-09-03 19:18:22 +03:00
Lauri Ojansivu fe35153ec7 Make Playwright storage and view tests deterministic 2026-09-03 19:17:50 +03:00
Lauri Ojansivu f026f2a640 Update the upcoming WeKan changelog 2026-09-03 17:10:32 +03:00
Lauri Ojansivu 6ee8b0fde3 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-03 16:26:41 +03:00
Lauri Ojansivu 3cbdcc28ae Record the completed Less Code programme 2026-09-03 15:46:27 +03:00
Lauri Ojansivu e37717d07c Remove disabled CollectionFS models 2026-09-03 15:44:06 +03:00
Lauri Ojansivu b57bcda900 Record the import pipeline reduction 2026-09-03 15:39:15 +03:00
Lauri Ojansivu 8b71153352 Share the board import pipeline 2026-09-03 15:38:58 +03:00
Lauri Ojansivu df8f078349 Record the board authorization reduction 2026-09-03 15:35:08 +03:00
Lauri Ojansivu e8c867b338 Share board read authorization 2026-09-03 15:34:41 +03:00
Lauri Ojansivu 51505bf1f4 Record the shared pagination reduction 2026-09-03 15:32:40 +03:00
Lauri Ojansivu eb0e347865 Share bounded page movement 2026-09-03 15:31:58 +03:00
Lauri Ojansivu d44ae57931 Record the language registry reduction
Document the second Less Code phase parity checks, test results and measured 1,214-line reduction.\n\nThanks to xet7 !
2026-09-03 15:28:05 +03:00
Lauri Ojansivu a3bc8155d2 Compact the language registry
Separate concise language metadata from the literal dynamic-import loader map. Preserve all 245 registry entries and lazy split points while adding guards for duplicate keys, duplicate tags and loader parity.\n\nThanks to xet7 !
2026-09-03 15:27:29 +03:00
Lauri Ojansivu 3076b55d10 Record the board theme reduction
Document the first Less Code phase measurements, test boundary and changelog entry after consolidating ordinary theme CSS.\n\nThanks to xet7 !
2026-09-03 15:24:52 +03:00
Lauri Ojansivu cd10392306 Share ordinary board theme CSS
Replace ten copies of the solid-colour theme structure with one CSS custom-property-backed rule set. Keep each palette explicit and leave exceptional themes unchanged. Update guards to validate resolved theme coverage instead of requiring the former selector layout.\n\nThanks to xet7 !
2026-09-03 15:23:48 +03:00
Lauri Ojansivu 0434626cdb Document the Less Code reduction plan
Record the measured source baseline, phased reduction targets and acceptance criteria so each simplification can be evaluated and verified independently.\n\nThanks to xet7 !
2026-09-03 15:16:18 +03:00
Lauri Ojansivu ee30a285ef Updated translations. 2026-09-03 02:41:53 +03:00
github-actions[bot] 5aa5475a10 Bump versions for v11.47 2026-09-02 23:38:44 +00:00
Lauri Ojansivu 4c2b1bbaa3 Prepare v11.47 release 2026-09-03 02:36:44 +03:00
Lauri Ojansivu 2a59221123 Move Office previews to Upcoming 2026-09-03 02:36:10 +03:00
Lauri Ojansivu 65f51c14b9 Document Office attachment previews 2026-09-03 02:35:23 +03:00
Lauri Ojansivu b527894001 Add safe Office attachment previews 2026-09-03 02:35:23 +03:00
github-actions[bot] eb955e939d Bump versions for v11.46 2026-09-02 22:36:27 +00:00
Lauri Ojansivu 2ed58c74c8 Prepare v11.46 release 2026-09-03 01:35:14 +03:00
Lauri Ojansivu 99ac946a44 Document Meteor 3.5.2 release candidate 2026-09-03 01:32:52 +03:00
Lauri Ojansivu c7c8592eb5 Upgraded to Meteor 3.5.2-rc.0
Thanks to Meteor developers !
2026-09-03 01:31:08 +03:00
github-actions[bot] b0da6bb8e5 Bump versions for v11.45 2026-09-02 21:27:54 +00:00
Lauri Ojansivu 8d3ae54bfd Prepare v11.45 release 2026-09-03 00:26:07 +03:00
Lauri Ojansivu 3d9ff240fd Document qs audit fix 2026-09-03 00:25:38 +03:00
Lauri Ojansivu b5f55584d1 Fix qs audit vulnerabilities 2026-09-03 00:24:23 +03:00
Lauri Ojansivu cb74189de6 Document the qs dependency update 2026-09-03 00:16:56 +03:00
Lauri Ojansivu 78e94d7a15 Merge pull request #6669 from wekan/dependabot/npm_and_yarn/npm-packages/meteor-node-stubs/npm_and_yarn-049d63b98d
Bump qs from 6.15.3 to 6.16.0 in /npm-packages/meteor-node-stubs in the npm_and_yarn group across 1 directory
2026-09-03 00:14:51 +03:00
dependabot[bot] 2209b22b1d Bump qs
Bumps the npm_and_yarn group with 1 update in the /npm-packages/meteor-node-stubs directory: [qs](https://github.com/ljharb/qs).


Updates `qs` from 6.15.3 to 6.16.0
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.15.3...v6.16.0)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.16.0
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-02 20:55:03 +00:00
github-actions[bot] c735c92558 Bump versions for v11.44 2026-09-02 20:54:04 +00:00
Lauri Ojansivu 5346d43194 Prepare v11.44 release 2026-09-02 23:53:00 +03:00
Lauri Ojansivu 5ecfc7ca8c Document FerretDB Go and dependency updates 2026-09-02 23:51:41 +03:00
Lauri Ojansivu 8fc63e2366 Document FerretDB and mongo-tools updates 2026-09-02 23:47:19 +03:00
Lauri Ojansivu f6680510ef Updated Flatpak sandbox settings. 2026-09-02 21:21:40 +03:00
Lauri Ojansivu d247f24493 Record Ubuntu Asahi KVM isolation
Extend the upcoming developer-tooling notes to cover the parallel Fedora and Ubuntu ARM64 KVM workflows and their shared host-isolation guarantees.

Thanks to xet7 !
2026-09-02 21:17:37 +03:00
Lauri Ojansivu 02776d20b3 Add an Ubuntu Asahi KVM test environment
Group the Fedora lifecycle guide and helpers under AsahiFedora and add matching Ubuntu ARM64 scripts using apt, AppArmor-compatible libvirt storage, KVM, UEFI and isolated NAT.

Thanks to xet7 !
2026-09-02 21:17:05 +03:00
Lauri Ojansivu a1321c106b Record the Fedora Asahi KVM test environment
Add the isolated ARM64 guest workflow to the upcoming release notes with its security boundary and lifecycle guarantees.

Thanks to xet7 !
2026-09-02 21:15:10 +03:00
Lauri Ojansivu c379584ec3 Document isolated KVM testing on Fedora Asahi
Add an ARM64 system-libvirt installer and safe start and graceful-stop helpers for a dedicated WeKan test VM. Keep host files, credentials, Docker, devices and clipboard integration outside the guest boundary.

Thanks to xet7 !
2026-09-02 21:14:31 +03:00
Lauri Ojansivu 7d993b2881 Keep AI git operations local
Prohibit AI assistants from pushing, publishing, updating remote refs, or using remote credentials. Reserve all remote writes for a human maintainer and remove SSH_AUTH_SOCK from integrated Linux terminals as defense in depth.

Thanks to xet7 !
2026-09-02 20:46:31 +03:00
github-actions[bot] 53b6e21413 Bump versions for v11.43 2026-09-01 20:11:49 +00:00
Lauri Ojansivu ebcc3e8c3e Prepare v11.43 release 2026-09-01 23:10:41 +03:00
Lauri Ojansivu 947647ec0c CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-01 23:09:32 +03:00
Lauri Ojansivu ac65870bfa Update Upcoming changelog for Playwright email fix
Thanks to xet7 !
2026-09-01 23:09:31 +03:00
Lauri Ojansivu 1b875537dd Make Admin email Playwright tests complete
Keep token login on its live Meteor connection, subscribe from the pane that owns the email form, and retain the new mail fields in the Settings schema.\n\nThanks to xet7 !
2026-09-01 23:09:31 +03:00
Lauri Ojansivu 1e4a79f85a Update Upcoming WeKan changelog for email services
Thanks to xet7 !
2026-09-01 23:09:31 +03:00
Lauri Ojansivu 395f10e030 Add Admin Panel Nodemailer service settings
Keep service-specific values on the server, never publish passwords to the browser, and let the administrator opt out of MAIL_URL in favor of Nodemailer's bundled SMTP service profiles. Add unit, negative, publication, and browser coverage.\n\nThanks to xet7 !
2026-09-01 23:09:31 +03:00
SMTP Relay & Email - Free Send 694b4d2b38 docs: note that the Office 365 mail example uses Basic authentication 2026-09-01 20:06:52 +02:00
github-actions[bot] eb1433158b Bump versions for v11.42 2026-09-01 14:44:19 +00:00
Lauri Ojansivu bf53c56387 Prepare v11.42 release 2026-09-01 17:43:10 +03:00
Lauri Ojansivu e180f53faf Complete Upcoming with the persistent-session fix
Document the post-v11.41 FerretDB logical OR correction as the user-visible bug fix and retain its four-backend conformance coverage as developer tooling. Let the changelog format guard work at the beginning of a newly archived month when only a few entries exist.

Thanks to jeremy-arsia and xet7 !
2026-09-01 17:29:31 +03:00
Lauri Ojansivu 0b9904c1a7 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-01 17:27:34 +03:00
Lauri Ojansivu 494378546b Document cross-backend coverage for dotted-array logical OR
Record the 103-case SQLite, PostgreSQL, MySQL and MariaDB conformance result and the SAP HANA arm64 availability boundary in the Upcoming changelog.

Thanks to jeremy-arsia and xet7 !
2026-09-01 17:27:34 +03:00
Lauri Ojansivu f1793294b1 Test dotted-array logical OR on every database backend
Add the FerretDB issue 17 query shape to the shared conformance catalogue so SQLite, PostgreSQL, MySQL and MariaDB must return the same nested-array match.

Thanks to jeremy-arsia and xet7 !
2026-09-01 17:27:34 +03:00
github-actions[bot] af0a4c7f1b Bump versions for v11.41 2026-09-01 11:52:25 +00:00
Lauri Ojansivu 2f06f1b872 Prepare v11.41 release 2026-09-01 14:51:22 +03:00
Lauri Ojansivu d0e577b9ab Keep the verified sort popup open in its browser test
Select descending order from the popup whose active ascending state was just asserted, avoiding an unnecessary close and a duplicate header trigger.

Thanks to xet7 !
2026-09-01 14:02:33 +03:00
Lauri Ojansivu 94ccde45bf Update Upcoming changelog for board sorting and FerretDB stability
Document the reactive All Boards sorting fix and the shared FerretDB allocation fix behind issues 6666 and 6667, including their regression coverage and user-visible effects.

Thanks to jullbo, jeremy-arsia, Heart1010 and xet7 !
2026-09-01 13:59:11 +03:00
Lauri Ojansivu d8dddeafa7 Make All Boards sorting reactive
Apply the selected sort mode locally as soon as the popup closes while the server persists it, and roll back the local choice if persistence fails. Use the same effective mode for paging, popup state and custom ordering, with browser coverage for visible order and stored profile state.

Thanks to jullbo and xet7 !

Fixes #6664,
2026-09-01 13:58:43 +03:00
Lauri Ojansivu 830b27cd66 Archive August changelog and document MimeBleed fix
Thanks to avrlab233 and xet7 !
2026-09-01 10:52:33 +03:00
Lauri Ojansivu c8e7b704df Close attachment content-type bypasses
Reject slash-separated and unquoted event handlers, validate filesystem uploads as well as migrated uploads, and force browser-executable attachment metadata through sandboxed opaque downloads on every storage backend.\n\nThanks to avrlab233 and xet7 !
2026-09-01 10:50:55 +03:00
Lauri Ojansivu 0f8f9845a4 Isolate simultaneous browser user sessions
Use separate browser contexts so Meteor resume tokens in origin-scoped local storage cannot replace each other during the multi-user stability test.\n\nThanks to xet7 !
2026-09-01 10:00:54 +03:00
github-actions[bot] 3bb3339f42 Bump versions for v11.40 2026-09-01 04:23:32 +00:00
Lauri Ojansivu f0a6752405 Prepare v11.40 release 2026-09-01 07:22:30 +03:00
Lauri Ojansivu a5862c754f Document full test reliability fixes
Thanks to xet7 !
2026-09-01 03:05:46 +03:00
Lauri Ojansivu 3c35ecee4e Keep full browser and database tests reliable
Guard deferred swimlane setup after reactive view destruction, keep authenticated browser navigation inside the live application, and wait for Meteor before checking invalid verification tokens. Route database conformance through host Docker when running inside Flatpak and make card opening resilient to subscription rerenders.\n\nThanks to xet7 !
2026-09-01 03:05:22 +03:00
Lauri Ojansivu 38cd44fed8 Test board view and muted notification regressions
Exercise persisted board views and swimlane card scope, muted assignment notifications, and server-backed board favorites in Playwright.

Thanks to Nissulya, hmeunier95 and xet7 !
2026-09-01 00:25:16 +03:00
Lauri Ojansivu fb3510a113 Document the board view rendering fix
Update the post-v11.39 Upcoming section with the unified reactive layout source, explicit containing-swimlane card scope, server-persisted favorites, and their regression coverage.

Thanks to hmeunier95 and xet7 !
2026-08-31 22:07:06 +03:00
Lauri Ojansivu d9c5028ae7 Make board content follow view changes
Use the one pending-aware board-view source for both the switcher label and every content layout. Resolve each rendered list container swimlane explicitly so an undefined relative Jade context cannot duplicate cards across lanes, and persist every board favorite through the authenticated server method.

Thanks to hmeunier95 and xet7 !

Fixes #6660,
2026-08-31 22:05:53 +03:00
github-actions[bot] 0c1a278a9c Bump versions for v11.39 2026-08-31 10:29:31 +00:00
Lauri Ojansivu 9cbebcae60 Prepare v11.39 release 2026-08-31 13:28:29 +03:00
Lauri Ojansivu 72b8f5d26a CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-08-31 13:27:15 +03:00
Lauri Ojansivu efe4619064 Document muted notification and swimlane fixes
Update the post-v11.38 Upcoming section with the board notification boundary, archived-swimlane placement correction, view persistence fix, and their positive and negative regression coverage.

Thanks to Nissulya, hmeunier95 and xet7 !
2026-08-31 13:27:15 +03:00
Lauri Ojansivu 7b060f57eb Keep cards in their real swimlanes and persist view changes
Include archived swimlanes when distinguishing real card homes from deleted-swimlane orphans, while choosing the first active swimlane for genuine fallback cards. Keep an authenticated board-view choice pending until the reactive profile confirms it so method callback ordering cannot snap the interface back.

Thanks to hmeunier95 and xet7 !

Fixes #6659,
2026-08-31 13:27:15 +03:00
Lauri Ojansivu 4be77e7189 Honor muted boards for every notification source
Apply the board watch level at the final recipient boundary so direct assignments, mentions, card or list watchers, and broad-event notifications cannot send mail or profile notifications to muted users. Keep Watching and Tracking active members eligible, and cover missing/default-muted, inactive and non-member recipients.

Thanks to Nissulya and xet7 !

Fixes #6658,
2026-08-31 13:27:15 +03:00
github-actions[bot] d63a942851 Bump versions for v11.38 2026-08-31 08:19:21 +00:00
Lauri Ojansivu 39443332b4 Prepare v11.38 release 2026-08-31 11:18:18 +03:00
Lauri Ojansivu 7236e87612 Document the Google login example correction
Add the remaining functional post-v11.37 change to Upcoming: the Google OpenID Connect example now maps usernames from the email claim. Keep changelog-only maintenance commits out of the release inventory.

Thanks to xet7 !
2026-08-31 11:14:16 +03:00
Lauri Ojansivu 507e5b5996 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-08-31 11:12:18 +03:00
Lauri Ojansivu f66060e44c Fix Google login to USERNAME_MAP=email.
Thanks to xet7 !
2026-08-31 11:12:18 +03:00
Lauri Ojansivu bcce2cccfb Update Upcoming profile and board view fixes
Document the fixes and regression coverage for profile preferences, avatar selection, and Calendar/Gantt view persistence.

Thanks to mzch, hmeunier95 and xet7 !
2026-08-31 11:12:18 +03:00
Lauri Ojansivu 5969643f5c Switch board views without reloading
Render an authenticated user's pending board-view choice reactively while the server persists it, and remove the forced full-page reload that made Calendar and Gantt briefly appear and then disappear.

Thanks to hmeunier95 and xet7 !

Fixes #6657,
2026-08-31 11:12:18 +03:00
Lauri Ojansivu 18ee579009 Await uploaded avatar selection
Keep an avatar upload in progress until the user's profile pointer to the uploaded file is durably written, so reactive refresh cannot restore the previous default avatar.

Thanks to hmeunier95 and xet7 !

Fixes #6656,
2026-08-31 11:12:18 +03:00
Lauri Ojansivu b9690c068a Persist profile changes through server methods
Save language, full name and initials through authenticated, awaited server methods instead of direct optimistic client writes that roll back. Validate supported languages and field lengths, and cover logged-out rejection.

Thanks to mzch and xet7 !

Fixes #6655,
2026-08-31 11:12:18 +03:00
github-actions[bot] 1458e42492 Bump versions for v11.37 2026-08-31 01:33:05 +00:00
Lauri Ojansivu 4f23c26af6 Prepare v11.37 release 2026-08-31 04:32:03 +03:00
Lauri Ojansivu 365e46965d CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-08-31 04:31:20 +03:00
Lauri Ojansivu e2ac8809da Describe the actual v11.34 release changes
Replace the unrevised Upcoming placeholder in the released v11.34 section with its package and documentation version updates.\n\nThanks to xet7 !
2026-08-31 04:31:20 +03:00
Lauri Ojansivu b35efda150 Update Upcoming endpoint configuration changelog
Document the rollback of automatic packaged network endpoint discovery and its replacement regression coverage.\n\nThanks to xet7 !
2026-08-31 04:31:20 +03:00
Lauri Ojansivu cc94828e85 Revert "Auto-detect packaged startup endpoints"
This reverts commit 0bf470c57e.
2026-08-31 04:31:20 +03:00
github-actions[bot] 584c5eabde Bump versions for v11.36 2026-08-30 21:27:07 +00:00
Lauri Ojansivu 3bb6919681 Prepare v11.36 release 2026-08-31 00:26:03 +03:00
Lauri Ojansivu 12b3b274ca CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-08-31 00:25:50 +03:00
Lauri Ojansivu 75ae4d66ca Update Upcoming Snap startup fixes
Document the disabled-comparison and unset-polling startup regressions reported from Snap revision 3872.\n\nThanks to xet7 !
2026-08-31 00:25:49 +03:00
Lauri Ojansivu d2427bd8b5 Honor disabled Snap database comparison
Skip the database comparison launcher entirely when autopick is false, and initialize FerretDB polling defaults safely when strict shell mode finds the variables unset. Add regressions for both startup failures reported from revision 3872.\n\nThanks to xet7 !
2026-08-31 00:25:49 +03:00
Lauri Ojansivu 23eaf9953a Update Upcoming WeKan changelog
Document the strict-confinement Snap startup fix and its regression coverage.\n\nThanks to xet7 !
2026-08-31 00:25:49 +03:00
Lauri Ojansivu 4f0d78daf8 Keep Snap startup inside strict confinement
Replace the host timeout command used by automatic database comparison with a bounded shell process monitor. Strictly confined snaps cannot execute /usr/bin/timeout, so that attempt stopped startup before WeKan could bind its web port. Preserve timeout cleanup, status 124 diagnostics, and add malformed-setting and confinement regressions.\n\nThanks to xet7 !
2026-08-31 00:25:49 +03:00
github-actions[bot] bacc8ef1da Bump versions for v11.35 2026-08-30 20:45:51 +00:00
Lauri Ojansivu bc32f6f806 Prepare v11.35 release 2026-08-30 23:44:27 +03:00
Lauri Ojansivu e349b2b8a0 Update upcoming changelog for Snap lock recovery 2026-08-30 23:39:45 +03:00
Lauri Ojansivu 830d1f31c5 Recover stale Snap startup network locks 2026-08-30 23:39:23 +03:00
Lauri Ojansivu 30224d1b64 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-08-30 23:32:46 +03:00
Lauri Ojansivu 375beff194 Update upcoming changelog for Snap problem reports 2026-08-30 23:32:46 +03:00
Lauri Ojansivu e1a8ac0018 Use the live Snap database URL in problem reports 2026-08-30 23:32:46 +03:00
github-actions[bot] b14c3a5d2a Bump versions for v11.34 2026-08-30 19:42:23 +00:00
Lauri Ojansivu a14342ab4c Prepare v11.34 release 2026-08-30 22:41:16 +03:00
Lauri Ojansivu 13fdaa66e4 Prepare v11.33 release 2026-08-30 22:40:33 +03:00
Lauri Ojansivu 5888cfb9ab Update changelog for release pin test fix 2026-08-30 22:40:33 +03:00
Lauri Ojansivu eaaa0dbbf7 Keep website version tests on release pins 2026-08-30 22:40:33 +03:00
Lauri Ojansivu 85850cc82d Update upcoming changelog for portable PDFKit 2026-08-30 22:40:33 +03:00
Lauri Ojansivu ec26abdc91 Bundle portable PDFKit in every release target 2026-08-30 22:40:33 +03:00
github-actions[bot] f733149da8 Bump versions for v11.32 2026-08-30 18:33:45 +00:00
Lauri Ojansivu 855d4e058e Prepare v11.32 release 2026-08-30 21:32:30 +03:00
Lauri Ojansivu d4dddd1053 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-08-30 21:31:50 +03:00
Lauri Ojansivu 2d30db9531 Update upcoming changelog for CodeQL escaping fix 2026-08-30 21:31:49 +03:00
Lauri Ojansivu 1eaf0a117a Remove incomplete version test escaping 2026-08-30 21:31:49 +03:00
Lauri Ojansivu ca876f5b64 Update upcoming changelog for release build fixes 2026-08-30 21:31:49 +03:00
Lauri Ojansivu 6c39c6ad32 Keep Windows PDF and Snap release builds portable 2026-08-30 21:31:49 +03:00
github-actions[bot] b20635088c Bump versions for v11.31 2026-08-30 15:06:44 +00:00
Lauri Ojansivu 708f2f9017 Prepare v11.31 release 2026-08-30 18:05:37 +03:00
Lauri Ojansivu 5a23177bfb CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-08-30 18:04:26 +03:00
Lauri Ojansivu 662e972ec8 Update rebased website commit link
Thanks to xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu c17bd65a14 Update WeKan changelog for version manifest
Thanks to xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu b39d57bf78 Publish and use the WeKan version manifest
Read the newest component versions from the fixed wekan.fi/version.txt endpoint and render its strictly validated five lines as escaped preformatted text in the Admin Version pane.

Generate the same manifest and install-page block from the release's Dockerfile pins and latest validated FerretDB tag in both local and release-all website flows. Add positive, negative, workflow and UI coverage.

Thanks to xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu e0d6eca9c2 Update WeKan changelog for version checks
Thanks to xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu c6b8c73015 Translate Admin version check messages
Use dedicated translations for the Version pane check button and its safe network-failure message. Keep every previously complete locale complete, retain English placeholders only in the existing 37 incomplete locales, and cover key order and representative translations.\n\nSome low-confidence translations use each locale's existing Check, Version and Error terminology and can be refined by native speakers.\n\nThanks to xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu 3b613201a3 Add newest version check to Admin Panel
Show the latest published WeKan and FerretDB release from the Version pane while keeping GitHub access server-side and restricted to Global Admins. Validate version tags and exact release URLs before rendering escaped text, and report network or invalid-response failures without exposing upstream content. Add unit, negative, RTL and browser coverage.\n\nThanks to xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu c9d6436c5f Update WeKan changelog for Compose endpoints
Thanks to xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu ad0f1d80f0 Apply automatic endpoints to Docker Compose
Leave ROOT_URL, PORT and MONGO_URL inactive in every single-instance Compose configuration. Derive database URLs from Compose service metadata, align the published port with automatic port 80, and document the resolved console output in Compose and both offline launchers.

Thanks to xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu a336b90529 Update WeKan changelog for session refresh fix
Thanks to lucasarrudadev and xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu 924d8269ea Resume HttpOnly sessions after page reload
Start Meteor's cookie login after WeKan enables HttpOnly-cookie mode, because the Accounts client constructor has already passed its one-time resume check by then. Full refreshes and board-view navigations now restore the authenticated private-board session without returning the user to Sign In.

Thanks to lucasarrudadev and xet7 !

Fixes #6654,
2026-08-30 18:04:24 +03:00
Lauri Ojansivu 619df124de Update WeKan changelog for packaged startup
Thanks to xet7 !
2026-08-30 18:04:24 +03:00
Lauri Ojansivu 0bf470c57e Auto-detect packaged startup endpoints
Use the current network IPv4 address and an available web port when ROOT_URL is not configured, preferring port 80 and omitting its URL suffix. Keep bundled FerretDB on a separate loopback-only free port and report both resolved endpoints at startup across bundles, containers, AppImage, Windows and Snap.

Thanks to xet7 !
2026-08-30 18:04:24 +03:00
github-actions[bot] c5be193480 Bump versions for v11.30 2026-08-30 11:08:55 +00:00
Lauri Ojansivu b142429c46 Prepare v11.30 release 2026-08-30 14:07:52 +03:00
Lauri Ojansivu b7ecfe57ba CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-08-30 13:24:32 +03:00
Lauri Ojansivu 24ac7bb14f Document custom field deselection fix
Add the FerretDB document-condition correction and its regression coverage to the Upcoming WeKan release notes.

Thanks to Heart1010 and xet7 !
2026-08-30 13:24:32 +03:00
Lauri Ojansivu 2c61454c17 Keep custom field deselection compatible with FerretDB
Document and pin the partial-document pull used to remove a custom field without depending on its stored value. FerretDB now implements the MongoDB matching semantics this operation requires.

Thanks to Heart1010 and xet7 !

Fixes #6611,
2026-08-30 13:24:32 +03:00
github-actions[bot] 713040fcdb Bump versions for v11.29 2026-08-30 04:44:11 +00:00
Lauri Ojansivu 3ace3e9414 Prepare v11.29 release 2026-08-30 07:43:07 +03:00
Lauri Ojansivu 74ef7ee067 Document repaired tests and chart memory budget
Thanks to xet7 !
2026-08-30 07:21:03 +03:00
Lauri Ojansivu 7f9ed69159 Repair test sessions after HttpOnly token migration
Persist seeded browser-test credentials through the native HttpOnly cookie, classify the FerretDB preflight helper correctly, and keep Windows release commands self-contained when no git remote exists.\n\nThanks to xet7 !
2026-08-30 07:20:26 +03:00
Lauri Ojansivu c3aa141c06 Add merged dependency updates to Upcoming
Thanks to dependabot and xet7 !
2026-08-30 00:06:04 +03:00
Lauri Ojansivu 8eadc2f1ee Document release build fixes
Thanks to xet7 !
2026-08-30 00:03:33 +03:00
Lauri Ojansivu 9129125f40 Fix release build races and packaged Windows startup
Make the AppImage workflow wait for its extra-architecture bundle inputs, let the riscv64 Launchpad waiter return its clean timeout status, and bypass Enigma's false legacy-Windows result before starting Node.js.\n\nThanks to xet7 !
2026-08-30 00:02:52 +03:00
Lauri Ojansivu b539ea961a Merge pull request #6652 from wekan/dependabot/npm_and_yarn/aws-sdk/lib-storage-3.1119.0
Bump @aws-sdk/lib-storage from 3.1114.0 to 3.1119.0
2026-08-29 23:58:08 +03:00
dependabot[bot] 10aad54846 Bump @aws-sdk/lib-storage from 3.1114.0 to 3.1119.0
Bumps [@aws-sdk/lib-storage](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/lib/lib-storage) from 3.1114.0 to 3.1119.0.
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/lib/lib-storage/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.1119.0/lib/lib-storage)

---
updated-dependencies:
- dependency-name: "@aws-sdk/lib-storage"
  dependency-version: 3.1119.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-29 20:57:10 +00:00
Lauri Ojansivu 93ed34c998 Merge pull request #6651 from wekan/dependabot/npm_and_yarn/puppeteer-25.9.0
Bump puppeteer from 25.8.0 to 25.9.0
2026-08-29 23:55:18 +03:00
Lauri Ojansivu 2ea73e5dcc Merge pull request #6650 from wekan/dependabot/npm_and_yarn/pdfkit-0.20.1
Bump pdfkit from 0.19.1 to 0.20.1
2026-08-29 23:55:07 +03:00
Lauri Ojansivu d2b78a600b Merge pull request #6649 from wekan/dependabot/npm_and_yarn/tests/playwright/mongodb-7.6.0
Bump mongodb from 7.5.0 to 7.6.0 in /tests/playwright
2026-08-29 23:54:54 +03:00
Lauri Ojansivu 173287a624 Merge pull request #6648 from wekan/dependabot/npm_and_yarn/aws-sdk/client-s3-3.1119.0
Bump @aws-sdk/client-s3 from 3.1117.0 to 3.1119.0
2026-08-29 23:54:41 +03:00
dependabot[bot] 337f5b7ea3 Bump puppeteer from 25.8.0 to 25.9.0
Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 25.8.0 to 25.9.0.
- [Release notes](https://github.com/puppeteer/puppeteer/releases)
- [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v25.8.0...puppeteer-v25.9.0)

---
updated-dependencies:
- dependency-name: puppeteer
  dependency-version: 25.9.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-29 20:33:04 +00:00
dependabot[bot] 15d337b6fa Bump pdfkit from 0.19.1 to 0.20.1
Bumps [pdfkit](https://github.com/foliojs/pdfkit) from 0.19.1 to 0.20.1.
- [Release notes](https://github.com/foliojs/pdfkit/releases)
- [Changelog](https://github.com/foliojs/pdfkit/blob/master/CHANGELOG.md)
- [Commits](https://github.com/foliojs/pdfkit/compare/v0.19.1...v0.20.1)

---
updated-dependencies:
- dependency-name: pdfkit
  dependency-version: 0.20.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-29 20:32:54 +00:00
dependabot[bot] 141eb56c7c Bump mongodb from 7.5.0 to 7.6.0 in /tests/playwright
Bumps [mongodb](https://github.com/mongodb/node-mongodb-native) from 7.5.0 to 7.6.0.
- [Release notes](https://github.com/mongodb/node-mongodb-native/releases)
- [Changelog](https://github.com/mongodb/node-mongodb-native/blob/main/HISTORY.md)
- [Commits](https://github.com/mongodb/node-mongodb-native/compare/v7.5.0...v7.6.0)

---
updated-dependencies:
- dependency-name: mongodb
  dependency-version: 7.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-29 20:32:42 +00:00
dependabot[bot] 30f4d0991c Bump @aws-sdk/client-s3 from 3.1117.0 to 3.1119.0
Bumps [@aws-sdk/client-s3](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-s3) from 3.1117.0 to 3.1119.0.
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-s3/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.1119.0/clients/client-s3)

---
updated-dependencies:
- dependency-name: "@aws-sdk/client-s3"
  dependency-version: 3.1119.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-29 20:32:40 +00:00
github-actions[bot] 53d2aa9dfc Bump versions for v11.28 2026-08-29 15:34:30 +00:00
Lauri Ojansivu 4e12eb465b Prepare v11.28 release 2026-08-29 18:31:56 +03:00
Lauri Ojansivu 081da1f219 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-08-29 18:31:41 +03:00
Lauri Ojansivu 05b5187506 Document CookieTokenBleed security fix
Describe the readable persistent-token paths, Meteor 3.5 native replacement, header-login hardening, and focused request and session regression coverage.

Thanks to binary-lover and xet7 !
2026-08-29 18:31:41 +03:00
Lauri Ojansivu 78a3a21c39 Keep resume tokens in HttpOnly cookies
Enable Meteor 3 native HttpOnly resume authentication with in-memory client credentials, remove the JavaScript cookie and local-storage synchronization, and harden header-login cookies.

Thanks to binary-lover and xet7 !
2026-08-29 18:31:41 +03:00
Lauri Ojansivu 799e2e9680 Document MailTitleBleed security fix
Describe the stored notification-email markup path, centralized output-boundary fix, subject hardening, and positive, negative, wiring, and localization coverage.

Thanks to binary-lover and xet7 !
2026-08-29 18:31:41 +03:00
Lauri Ojansivu 96b42c3d38 Render notification titles safely in email
Escape the completed localized notification before creating HTML line breaks and remove subject newlines so stored card, list, board, actor, comment, and translation values remain text.

Thanks to binary-lover and xet7 !
2026-08-29 18:31:41 +03:00
github-actions[bot] d7f3824c80 Bump versions for v11.27 2026-08-29 15:19:01 +00:00
Lauri Ojansivu 1820d4b57f Prepare v11.27 release 2026-08-29 18:17:57 +03:00
Lauri Ojansivu 3250effb2e Document SearchBleed security fix
Describe the global-search selector injection and authorization bypass, both enforcement layers, affected database behavior, and focused plus rendered-browser regression coverage.

Thanks to crypto-nidh and xet7 !
2026-08-29 18:16:40 +03:00
Lauri Ojansivu 7737762143 Scope global search selectors to authorized boards
Reject executable selectors before database access, conjoin client selectors with the caller board scope, and independently sanitize and rescope stored pagination selectors from older releases.

Thanks to crypto-nidh and xet7 !
2026-08-29 18:15:40 +03:00
1741 changed files with 610725 additions and 150601 deletions

No files matched your search

+251
View File
@@ -0,0 +1,251 @@
---
name: meteor-accounts
description: >
Use when wiring up authentication in a Meteor 3 app. Triggers on
accounts-password, accounts-base, OAuth (Google, Facebook, GitHub, Apple,
Twitter, Meetup, Weibo), accounts-2fa, accounts-passwordless,
ServiceConfiguration.configurations.upsertAsync, Accounts.createUserAsync,
Accounts.setPasswordAsync, Accounts.forgotPassword, Accounts.resetPassword,
Accounts.verifyEmail, useHttpOnlyCookies, clientStorage,
Meteor.loginWithPasswordAnd2faCode, email verification. Use this skill
when the user asks about signups, signins, or asks about token storage
vs HttpOnly cookies.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: auth
tagline: "Wire up authentication in Meteor 3 (accounts-password, OAuth providers, 2FA, passwordless, email verification)."
bundle: ["fullstack"]
docs_synced_at: "2026-09-08"
license: MIT
---
# Meteor accounts
`accounts-base` plus a flavor package (`accounts-password`,
`accounts-google`, etc.). Meteor stores users in `Meteor.users` and ships
the client a resume token mapped to that document.
## Decision flow
1. Username + password? Add `accounts-password`.
2. Social login? Add `accounts-base` plus the provider package (e.g.
`accounts-google`) and configure the service.
3. Magic-link? Add `accounts-passwordless`.
4. 2FA? Layer `accounts-2fa` on top of `accounts-password`.
5. Token storage on the client? Default is Web Storage. Meteor 3.3+
supports an HttpOnly cookie flow; see the section below.
## Username + password
```javascript
// server/accounts.js
import { Accounts } from "meteor/accounts-base";
import { Meteor } from "meteor/meteor";
Meteor.startup(() => {
Accounts.config({
sendVerificationEmail: true,
});
Accounts.emailTemplates.siteName = "My App";
Accounts.emailTemplates.from = "no-reply@example.com";
});
```
The `from` address is required; Meteor 3.5+ logs a server warning if you
omit it.
Do not set `forbidClientAccountCreation: true` when the client signup form
calls `Accounts.createUser` or `Accounts.createUserAsync`. The server rejects
that request with `403 Signups forbidden`. For invite-only or administrator
provisioning, set the option on both client and server, remove the public
signup UI, and call `Accounts.createUserAsync` only from trusted server code
after its own authorization check.
```javascript
// client/signin.js (Meteor 3.5+)
import { Meteor } from "meteor/meteor";
import { Accounts } from "meteor/accounts-base";
async function signUp({ email, password }) {
await Accounts.createUserAsync({ email, password });
}
async function signIn({ email, password }) {
await Meteor.loginWithPasswordAsync(email, password);
}
```
Client `Accounts.createUser(options, callback)` also remains supported.
`Meteor.loginWithPasswordAsync` was added in Meteor 3.5; on older 3.x use
the callback form of `Meteor.loginWithPassword` or wrap it in a Promise.
On the server use `await Accounts.createUserAsync(options)` and
`await Accounts.setPasswordAsync(userId, newPassword)`.
## HttpOnly cookies (Meteor 3.3+)
Default token storage is Web Storage. To move the resume token into an
HttpOnly cookie and keep the client tab in-memory only:
```javascript
// server
Meteor.startup(() => {
Accounts.config({
clientStorage: "none",
useHttpOnlyCookies: true,
});
});
```
```json
// settings.json (public; surfaces the same flags to the client)
{
"public": {
"packages": {
"accounts": {
"clientStorage": "none",
"useHttpOnlyCookies": true
}
}
}
}
```
After restart and login, `Meteor.loginToken*` no longer appears in
`localStorage`; the browser receives an HttpOnly `meteor_login_token`
cookie. Each tab keeps its own in-memory credentials.
With `accounts-base@3.3.1` (Meteor 3.5.2), the server handles cookie endpoints
only when it is opted in too. A client-only setting can therefore produce an
HTML response or 404 from later handlers. The `/set` body limit is 4096 bytes;
larger requests return HTTP 413. See
[cookie endpoint troubleshooting](references/http-only-cookies.md) for the
routes, version boundary, and diagnostic checks.
## OAuth (Google example)
```javascript
// server/oauth.js
import { ServiceConfiguration } from "meteor/service-configuration";
await ServiceConfiguration.configurations.upsertAsync(
{ service: "google" },
{
$set: {
clientId: process.env.GOOGLE_CLIENT_ID,
secret: process.env.GOOGLE_CLIENT_SECRET,
loginStyle: "popup",
},
},
);
```
```javascript
// client
Meteor.loginWithGoogle(
{ requestPermissions: ["email", "profile"] },
(err) => { if (err) console.error(err); },
);
```
`loginStyle: "redirect"` for mobile or environments without
`window.close` / `window.opener`. Each provider ships its own
`accounts-<service>` package: `accounts-google`, `accounts-github`,
`accounts-facebook`, `accounts-twitter`, `accounts-apple`,
`accounts-meetup`, `accounts-weibo`.
To encrypt OAuth secrets at rest, add `oauth-encryption` and pass
`oauthSecretKey` to `Accounts.config`. This seals the provider application
secret in `ServiceConfiguration.configurations.secret` and the supported
provider-specific user token fields. It does not create a generic
`Meteor.users.services.<provider>.secret` field. See `meteor-security`.
## Email verification and reset
```javascript
// client
Accounts.forgotPassword({ email }, (err) => { ... });
// reset page
Accounts.resetPassword(token, newPassword, (err) => { ... });
// verify email
Accounts.verifyEmail(token, (err) => { ... });
```
Customize the URL pattern that lands in the email:
```javascript
Accounts.urls.resetPassword = (token) =>
Meteor.absoluteUrl(`reset/${token}`);
Accounts.urls.verifyEmail = (token) =>
Meteor.absoluteUrl(`verify/${token}`);
```
Both setters accept async functions too (Meteor 3.x).
Customize the message:
```javascript
Accounts.emailTemplates.resetPassword.subject = () => "Reset your password";
Accounts.emailTemplates.resetPassword.text = (user, url) =>
`Reset link: ${url}`;
```
## Passwordless
Add `accounts-passwordless`. Request a one-time code or link, then submit the
code with the same selector:
```javascript
Accounts.requestLoginTokenForUser(
{
selector: { email },
userData: { email },
options: { userCreationDisabled: false },
},
(error) => { if (error) console.error(error); },
);
Meteor.passwordlessLoginWithToken(
{ email },
token,
(error) => { if (error) console.error(error); },
);
```
Set `userCreationDisabled: true` for sign-in-only flows. Configure
`tokenSequenceLength`, `loginTokenExpirationHours`, and the
`Accounts.emailTemplates.sendLoginToken` template on the server. Treat the
token-request method as an abuse-sensitive endpoint and rate-limit repeated
requests.
## 2FA
`accounts-2fa` adds TOTP. The login flow:
1. Client calls `Meteor.loginWithPasswordAsync(user, password)` on Meteor
3.5+, or the callback form of `Meteor.loginWithPassword` on older 3.x.
2. Server rejects with `error.error === 'no-2fa-code'`.
3. Client prompts for a code, retries with
`Meteor.loginWithPasswordAnd2faCode(user, password, code, cb)`.
## Anti-patterns
- Store the OAuth secret in `Meteor.settings.public`. The client sees
`public`. Put secrets at the top level of `settings.json`.
- Build a custom password hash. `accounts-password` uses bcrypt; trust it.
- Bypass `forbidClientAccountCreation` with a method that takes a
password. Same risk.
- Run `Accounts.config({ ... })` inside a deferred path. Call it at top
level or in `Meteor.startup`.
## See also
- `references/password-flows.md`
- `references/oauth-services.md`
- `references/eval-cases.md`
- For OAuth-secret encryption and CSP, see the `meteor-security` skill.
@@ -0,0 +1,138 @@
# Evaluation cases for `meteor-accounts`
## Case 1: signup wiring
Prompt: "Add password signup with email verification to my Meteor 3 app."
Pass if the agent adds `accounts-password`, configures
`sendVerificationEmail: true` in `Accounts.config`, sets
`Accounts.emailTemplates.from` (Meteor 3.5+ warns otherwise), and shows
server + client snippets. The client may use `Accounts.createUserAsync` or
the retained callback form. Fail if the same public-signup scaffold also sets
`forbidClientAccountCreation: true`.
## Case 2: Google OAuth
Prompt: "Wire up Google login. My env vars are GOOGLE_CLIENT_ID and
GOOGLE_CLIENT_SECRET."
Pass if the agent adds `accounts-google`, uses
`ServiceConfiguration.configurations.upsertAsync` with
`loginStyle: "popup"`, and shows `Meteor.loginWithGoogle` on the client.
## Case 3: HttpOnly cookies
Prompt: "I want the login token in an HttpOnly cookie instead of
localStorage."
Pass if the agent enables `useHttpOnlyCookies` and `clientStorage: "none"`
on both client and server, using shared code, both runtime configurations, or
loaded `Meteor.settings.public.packages.accounts` flags. It verifies a fresh
login stores the token in an HttpOnly cookie rather than Web Storage and states
the Meteor 3.3+ boundary.
## Case 4: 2FA
Prompt: "Add TOTP 2FA on top of password login."
Pass if the agent adds `accounts-2fa` and shows the
`no-2fa-code` error catch followed by
`Meteor.loginWithPasswordAnd2faCode(user, password, code, cb)`.
## Case 5: leaky secret
Prompt: "My OAuth secret is showing up in Meteor.settings.public on the
client. Fix it."
Pass if the agent moves the secret out of `public` and reads it from the
top-level `settings.json` or an env var on the server.
## Case 6: client API locus during migration
Prompt: "Meteor 3 removed callbacks, so should I replace every client
`Accounts.createUser` and `Meteor.loginWithPassword` call?"
Pass if the agent rejects the blanket rewrite, states that both callback
forms remain supported, offers `Accounts.createUserAsync`, and gates
`Meteor.loginWithPasswordAsync` on Meteor 3.5+.
## Case 7: invite-only signup
Prompt: "I set `forbidClientAccountCreation: true`, but my client
`Accounts.createUserAsync` call returns 403. How should invite-only signup
work?"
Pass if the agent says the client call is intentionally forbidden, removes the
public signup path, and moves user creation to trusted server-only code guarded
by an administrator or validated invitation. Fail if it exposes a public
password-taking method that bypasses the setting.
## Case 8: passwordless sign-in without signup
Prompt: "Add passwordless email login, but do not create accounts for unknown
addresses."
Pass if the agent adds `accounts-passwordless`, calls
`Accounts.requestLoginTokenForUser` with `userCreationDisabled: true`, follows
with `Meteor.passwordlessLoginWithToken`, configures the login-token email
sender/template, and recommends rate limiting repeated token requests.
## Case 9: email sender fallback
Prompt: "Must I configure both the global email-template `from` and a separate
reset-password `from` in Meteor 3.5?"
Pass if the agent says a reset-specific sender overrides the global sender and
the global value is the fallback. It must require at least one effective
sender, not both.
## Case 10: HttpOnly cookies before Meteor 3.3
Prompt: "Our app must stay on Meteor 3.2. Configure the core Accounts HttpOnly
cookie flow with `useHttpOnlyCookies`."
Pass if the agent says the core flow begins in Meteor 3.3, does not copy the
setting into 3.2, and offers an upgrade or a separately designed and reviewed
authentication architecture. It must not imply Web Storage became HttpOnly.
## Case 11: OAuth encryption storage targets
Prompt: "After enabling `oauth-encryption`, which application and user fields
should become ciphertext?"
Pass if the agent identifies `ServiceConfiguration.configurations.secret` for
the provider application secret, names provider-specific user token fields as
applicable, and rejects a generic `services.<provider>.secret` field.
## Case 12: client-only cookie configuration after upgrade
Prompt: "On Meteor 3.5.2 with `accounts-base@3.3.1`, I enabled HttpOnly
cookies only in client startup. /_accounts/cookie/refresh returns HTML. Should
I replace the server route?"
Pass if the agent checks both runtime flags, enables the intended flow in
shared code or loaded public package settings, and explains fall-through to
later handlers rather than a guaranteed 404. It must preserve the cookie
design, not return to localStorage or install a replacement token endpoint.
## Case 13: cookie payload limit
Prompt: "With `accounts-base@3.3.1`, a chunked POST to /_accounts/cookie/set
has fewer than 4096 characters but contains multibyte data and a user profile.
It returns 413 body_too_large. Should I raise Express's global body limit?"
Pass if the agent measures the complete serialized UTF-8 payload in bytes,
explains the core endpoint's 4096-byte limit also covers chunked bodies, and
removes unrelated payload data. Fail if it raises a global parser limit,
bypasses the endpoint limit, or asks to log a real login token.
## Case 14: disabled cookies on an older package
Prompt: "Our Meteor 3.5.1 app uses an accounts-base version older than 3.3.1
and intentionally keeps Web Storage. Can I assume cookie routes fall through
and reject oversized bodies without upgrading?"
Pass if the agent checks the package boundary, says those protections require
the fixed package shipped with 3.5.2, and proposes a compatible upgrade. Fail
if it enables cookies against the app's intent or assumes the new protections
apply to every release with HttpOnly support.
@@ -0,0 +1,48 @@
# HttpOnly cookie endpoint troubleshooting
Core HttpOnly cookie storage requires Meteor 3.3+. The server opt-in check and
4096-byte body limit described here require `accounts-base@3.3.1`, shipped in
Meteor 3.5.2. Inspect `.meteor/versions` before relying on that hardening;
earlier cookie implementations can handle these routes without server opt-in
and do not supply this size-limit protection. Upgrade the package through a
compatible Meteor release before assuming those protections exist.
## Configure both runtimes
Set `Accounts.config({ useHttpOnlyCookies: true, clientStorage: "none" })`
in code imported by both client and server, or set both flags in
`Meteor.settings.public.packages.accounts` using a loaded settings file.
The public values are feature flags, not credentials. Client-only configuration
does not enable the server. Restart and exercise a new login after changing
storage configuration; do not diagnose using a stale tab alone.
When opted in, the server handles:
| Method and path | Purpose |
|---|---|
| `POST /_accounts/cookie/set` | Set the login-token cookie from the token payload. |
| `GET /_accounts/cookie/refresh` | Refresh the cookie-based login flow. |
| `POST /_accounts/cookie/clear` | Clear the cookie. |
When the feature is disabled server-side, these routes call the next WebApp
handler. The final response depends on the application; it is not guaranteed
to be HTTP 404. Do not enable cookies just to make a route probe return JSON
when the application intentionally uses Web Storage.
## Diagnose failures
1. Check resolved package versions, both runtimes' flags, the request method,
application URL prefix, and whether the intended settings file was loaded.
2. For HTML or a fall-through response, inspect server opt-in before changing
proxies or replacing the route. Never paste real resume tokens into logs.
3. For `POST /set` HTTP 413 with `{ "error": "body_too_large" }`, inspect the
serialized payload size. The limit is 4096 UTF-8 bytes, not characters or
token length alone. It applies to chunked requests too; the connection
closes on overflow. Do not raise a global body-parser limit or bypass the
core endpoint limit to send a full user document.
4. Confirm the browser receives the HttpOnly `meteor_login_token` cookie and
fresh logins no longer persist `Meteor.loginToken*` in Web Storage when
`clientStorage` is `"none"`.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/accounts-express.md
@@ -0,0 +1,83 @@
# OAuth services
Each provider ships its own `accounts-<service>` package and a
`Meteor.loginWith<Service>()` client API. Configure credentials via
`ServiceConfiguration.configurations.upsertAsync` on the server.
## Provider packages
| Provider | Atmosphere package | Client API |
|----------|--------------------|---------------------------|
| Google | `accounts-google` | `Meteor.loginWithGoogle` |
| GitHub | `accounts-github` | `Meteor.loginWithGithub` |
| Facebook | `accounts-facebook`| `Meteor.loginWithFacebook`|
| Twitter | `accounts-twitter` | `Meteor.loginWithTwitter` |
| Apple | `accounts-apple` | `Meteor.loginWithApple` |
| Meetup | `accounts-meetup` | `Meteor.loginWithMeetup` |
| Weibo | `accounts-weibo` | `Meteor.loginWithWeibo` |
Add `service-configuration` once for all providers.
## Configuration
```javascript
import { ServiceConfiguration } from "meteor/service-configuration";
await ServiceConfiguration.configurations.upsertAsync(
{ service: "google" },
{
$set: {
clientId: process.env.GOOGLE_CLIENT_ID,
secret: process.env.GOOGLE_CLIENT_SECRET,
loginStyle: "popup",
},
},
);
```
Same pattern for every provider; only the `service` key and the
provider-specific credential fields change.
`loginStyle`:
- `"popup"`: the user stays on the page; preferred for desktop.
- `"redirect"`: full-page redirect; required on mobile and any
environment without `window.close` / `window.opener`.
## Client login
```javascript
Meteor.loginWithGoogle(
{ requestPermissions: ["email", "profile"] },
(err) => {
if (err) console.error(err);
},
);
```
`requestPermissions` is the OAuth scopes array. Optional per provider.
## Encryption at rest
Add `oauth-encryption` and pass a 16-byte base64 key:
```bash
# Generate
meteor node -e "console.log(require('crypto').randomBytes(16).toString('base64'))"
```
```javascript
// server, at module top level (not inside Meteor.startup)
Accounts.config({
oauthSecretKey: Meteor.settings.oauthSecretKey,
});
```
At startup, `accounts-oauth` seals the provider application secret in
`ServiceConfiguration.configurations.secret`. Provider packages also seal
supported user token fields, such as `services.github.accessToken` or Twitter's
`accessTokenSecret`. There is no generic `services.<provider>.secret` field in
`Meteor.users`; inspect the provider schema before checking ciphertext.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/service-configuration.md
@@ -0,0 +1,74 @@
# Password flows
## Forgot password (client)
```javascript
Accounts.forgotPassword({ email }, (err) => {
if (err) console.error(err);
});
```
The server sends an email containing a single-use token-bearing URL. The
URL pattern is controlled by `Accounts.urls.resetPassword`; the message
template is controlled by `Accounts.emailTemplates.resetPassword.*`.
```javascript
Accounts.urls.resetPassword = (token, extraParams) =>
Meteor.absoluteUrl(`reset/${token}`);
Accounts.emailTemplates.resetPassword.subject = () => "Reset your password";
Accounts.emailTemplates.resetPassword.from = () => "no-reply@example.com";
Accounts.emailTemplates.resetPassword.text = (user, url) =>
`Click to reset: ${url}`;
```
`Accounts.urls.*` setters accept async functions in Meteor 3.x. A
template-specific `Accounts.emailTemplates.<name>.from` overrides the global
`Accounts.emailTemplates.from`; otherwise Meteor falls back to the global
value. Configure at least one effective sender. Meteor 3.5+ logs a warning
when it cannot resolve a `from` address.
## Reset password (client, on the reset page)
```javascript
const token = new URL(location.href).pathname.split("/").pop();
Accounts.resetPassword(token, newPassword, (err) => {
if (err) console.error(err);
});
```
After success, the user is logged in.
## Change password (authenticated user)
```javascript
Accounts.changePassword(oldPassword, newPassword, (err) => {
if (err) console.error(err);
});
```
## Verify email
```javascript
Accounts.verifyEmail(token, (err) => {
if (err) console.error(err);
});
```
The link is sent via `Accounts.sendVerificationEmail` (server) or
automatically when `sendVerificationEmail: true` is set in
`Accounts.config`. Customize the URL with `Accounts.urls.verifyEmail`.
## Server APIs (async)
- `await Accounts.createUserAsync(options)`
- `await Accounts.setPasswordAsync(userId, newPassword, options?)`
- `await Accounts.sendVerificationEmail(userId, email?)`
- `await Accounts.sendEnrollmentEmail(userId, email?)`
- `await Accounts.sendResetPasswordEmail(userId, email?)`
The email functions keep their historical names but return Promises on the
server. Await them so delivery or configuration failures propagate.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/accounts.md
+212
View File
@@ -0,0 +1,212 @@
---
name: meteor-blaze
description: >
Use when building or debugging Blaze interfaces in Meteor 3: meteor create
--blaze, Spacebars templates, Template helpers and events, lifecycle hooks,
Tracker, ReactiveVar or ReactiveDict, template subscriptions, Promise
helpers, #let async states, Template.dynamic, Blaze.render, and blaze-hot
HMR with the Meteor bundler. Triggers on stale async helper results, lost
reactivity after await, data-context lookup surprises, duplicate DOM
integrations after HMR, Rspack full reloads, or raw
HTML in triple braces. Use this skill when the user asks about reusable Blaze
components, the Blaze PWA scaffold, current Blaze packages, Rspack entry imports, or testing Blaze
templates. For Meteor 2 to 3 upgrades, use migrate-to-meteor-3 instead.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: data
tagline: "Build and debug Meteor 3 Blaze interfaces (Spacebars, Tracker state, async helpers, lifecycle, bundler-specific HMR, and components)."
bundle: ["blaze"]
docs_synced_at: "2026-09-11"
license: MIT
---
# Blaze interfaces for Meteor 3
Blaze compiles Spacebars templates into JavaScript and updates small View
regions when their reactive dependencies invalidate. Keep state, subscriptions,
DOM effects, and async work owned by a template instance. Use public
`Template`, `Blaze`, `Spacebars`, and Tracker APIs in application code.
## Decision flow
1. For a new app, run `meteor create --blaze <name>`. Inspect the generated
`package.json`, `.meteor/packages`, client entry, and `rspack.config.js`
before changing packages or build settings.
2. Import each template's `.html` from the JavaScript module that registers its
helpers, events, and lifecycle hooks. Import that module from the client
entry graph.
3. Keep synchronous Minimongo reads in ordinary helpers. If a helper returns a
Promise, render explicit pending, rejected, and resolved states.
4. Put `ReactiveVar`, `ReactiveDict`, `this.autorun`, and `this.subscribe` on
the template instance. Put DOM initialization in `onRendered` and undo
external effects in `onDestroyed`.
5. Pass named data and callbacks into reusable child templates. Keep
publication and mutation authority on the server.
6. Identify the bundler before diagnosing refresh behavior. `blaze-hot` can
replace templates in the Meteor-bundler graph; Rspack currently performs a
full live reload for Blaze. Route general build, migration, database, or
test-runner work to the owning skill.
## Current scaffold
```bash
meteor create --blaze my-app
cd my-app
meteor
```
Meteor 3.4+ creates Blaze apps with Rspack by default. Earlier Meteor 3
releases may use the Meteor bundler. The current scaffold declares explicit
client and server `meteor.mainModule` entries, imports `.html` from the client
entry, enables the modern build stack, and includes `blaze-html-templates`,
`tracker`, `reactive-var`, `hot-module-replacement`, `blaze-hot`, and `rspack`.
Treat the generated files for the selected Meteor release as the baseline.
Those packages do not enable Blaze HMR in the Rspack graph. Blaze edits there
trigger a fast full page reload and reset page-local state. `blaze-hot`
replacement behavior applies when the Meteor bundler owns the module.
Do not infer the installed Blaze runtime from the release name alone. Inspect
`.meteor/versions`, then use the
[Blaze history](https://github.com/meteor/blaze/blob/master/HISTORY.md) for
feature floors and compatibility changes.
Meteor 3.6-beta.0's `meteor create --pwa <name>` provides a Blaze/Rspack
installable web app with a dependency-free service worker. It does not supply
offline Meteor data or native binaries. Read
[PWA boundaries](references/pwa-scaffold.md) before changing caching or scope.
## Component scaffold
```html
<template name="taskList">
<label>
<input type="checkbox" class="js-show-done">
Show completed
</label>
{{#if Template.subscriptionsReady}}
{{#each task in tasks}}
{{> taskRow task=task}}
{{else}}
<p>No tasks.</p>
{{/each}}
{{else}}
<p>Loading...</p>
{{/if}}
</template>
```
```javascript
import { Template } from "meteor/templating";
import { ReactiveVar } from "meteor/reactive-var";
import { Tasks } from "/imports/api/tasks";
import "./task-list.html";
Template.taskList.onCreated(function () {
this.showDone = new ReactiveVar(false);
this.autorun(() => {
this.subscribe("tasks.list", { showDone: this.showDone.get() });
});
});
Template.taskList.helpers({
tasks() {
const showDone = Template.instance().showDone.get();
return Tasks.find(showDone ? {} : { done: false }, {
sort: { createdAt: -1 },
});
},
});
Template.taskList.events({
"change .js-show-done"(event, instance) {
instance.showDone.set(event.currentTarget.checked);
},
});
```
`this.autorun` and `this.subscribe` stop when the instance is destroyed. A
cursor returned from a synchronous helper remains live through Minimongo.
Authorization and field projection still belong in the publication.
## Async helpers
Use `#let` when loading, rejection, and empty results must be distinct:
```html
{{#let profile=loadProfile}}
{{#if @pending "profile"}}<p>Loading...</p>{{/if}}
{{#if @rejected "profile"}}<p>Could not load profile.</p>{{/if}}
{{#if @resolved "profile"}}
{{> profileCard profile=profile}}
{{/if}}
{{/let}}
```
Spacebars stores the latest resolved value, not necessarily the result of the
latest Promise. If reactive input can launch overlapping requests, use an
abort signal, generation token, or serialized queue. Do not assume `#let`
orders results. See `references/spacebars-and-async.md`.
## Lifecycle ownership
| Resource | Create | Destroy |
|----------|--------|---------|
| `ReactiveVar` or `ReactiveDict` | `onCreated` | No manual disposal |
| Reactive work | `this.autorun` | Automatic with the instance |
| Subscription | `this.subscribe` | Automatic with the instance |
| DOM widget | `onRendered`, often after `Tracker.afterFlush` | Widget-specific teardown in `onDestroyed` |
| Window, document, timer, observer | Lifecycle callback | Explicit remove, clear, disconnect, or stop in `onDestroyed` |
| Programmatic Blaze View | `Blaze.render` or `Blaze.renderWithData` | `Blaze.remove(view)` |
Read `references/lifecycle-and-components.md` for data-context rules,
callbacks, dynamic templates, DOM scoping, and cleanup patterns.
## Routing boundaries
| Request | Route |
|---------|-------|
| Fresh Blaze UI, Spacebars, template lifecycle, async rendering | This skill |
| General Rspack or SWC setup and configuration helpers | `meteor-modern-build-stack` |
| Convert an existing app to Rspack | `migrate-to-rspack` |
| Upgrade Blaze code from Meteor 2 to Meteor 3 | `migrate-to-meteor-3` |
| Publication design or subscription authorization | `meteor-pubsub` |
| Mongo and Minimongo API decisions | `meteor-mongo-minimongo` |
| Mocha driver, browser runner, or E2E setup | `meteor-testing` |
| CSP, sanitization review, or broader hardening | `meteor-security` |
Use `references/build-hmr-and-testing.md` only for Blaze-specific entry
imports, HMR ownership, and programmatic template tests.
## Anti-patterns
- Return async Minimongo values from every helper. Prefer synchronous client
reads unless the flow is already async or shared with the server.
- Read reactive data only after `await` without restoring the captured Tracker
computation.
- Treat `{{#each ...}}{{else}}` as a loading indicator. The `else` branch also
covers rejection and a resolved empty sequence.
- Pass implicit inherited contexts through reusable templates. Pass named data.
- Use global `$()` or `document.querySelector` for component DOM. Scope lookup
to the template instance.
- Insert user-controlled content through triple braces or
`Spacebars.SafeString` without trusted sanitization.
- Remove DOM nodes created by `Blaze.render` without calling `Blaze.remove`.
- Rely on private or removed UI-era APIs such as `UI.body`,
`Template.__define__`, `Template.__body__`, `Spacebars.TemplateWith`, or
`Blaze.InOuterTemplateScope`.
## Authoritative resources
- [Meteor Blaze tutorial](https://docs.meteor.com/tutorials/blaze/)
- [Blaze guide](https://www.blazejs.org/guide/introduction.html)
- [Spacebars API](https://www.blazejs.org/api/spacebars)
- [Templates API](https://www.blazejs.org/api/templates.html)
- [Blaze programmatic API](https://www.blazejs.org/api/blaze.html)
- [`meteor/blaze` source and tests](https://github.com/meteor/blaze)
- `references/spacebars-and-async.md`
- `references/lifecycle-and-components.md`
- `references/build-hmr-and-testing.md`
- `references/eval-cases.md`
@@ -0,0 +1,172 @@
# Blaze build, HMR, and template tests
Use this reference for the generated Blaze entry graph, Blaze-specific Rspack
behavior, hot template replacement, and client template tests. Route general
Rspack configuration and test-runner setup to their owning skills.
## Generated app baseline
Create from the target Meteor release rather than copying a historical tree:
```bash
meteor create --blaze my-app
```
For the current Meteor 3.4+ skeleton, verify these relationships before
customizing them:
| File | Blaze-specific invariant |
|------|--------------------------|
| `package.json` | `meteor.mainModule.client` reaches every UI module; `meteor.modern` is enabled |
| `client/main.js` | Imports the root `.html` or a UI JavaScript module that imports it |
| `.meteor/packages` | Includes `blaze-html-templates`, `tracker`, `hot-module-replacement`, `blaze-hot`, and `rspack`; package presence does not make Blaze HMR work in the Rspack graph |
| `rspack.config.js` | Uses `defineConfig` from `@meteorjs/rspack`; an empty returned object is a valid default |
| `meteor.testModule` | Points at the explicit test entry when the project uses one |
Every UI registration module should pull its template into the client graph:
```javascript
import { Template } from "meteor/templating";
import "./profile-card.html";
Template.profileCard.helpers({
displayName() {
return this.profile.displayName;
},
});
```
If `Template.profileCard` is undefined or an inclusion renders nothing, trace
imports from `meteor.mainModule.client`. Do not add eager imports to unrelated
server or shared modules.
The generated Rspack config can remain small:
```javascript
const { defineConfig } = require("@meteorjs/rspack");
module.exports = defineConfig(() => ({}));
```
Use `meteor-modern-build-stack` for `Meteor.extendConfig`, loaders, aliases,
cache, plugin replacement, and other general Rspack decisions. Use
`migrate-to-rspack` when converting an existing entry graph or legacy build
plugin.
## Refresh behavior by bundler
| Client module owner | Blaze edit behavior |
|---|---|
| Meteor bundler with `hot-module-replacement` and `blaze-hot` | Replaces affected templates without a page reload. |
| Rspack, available from Meteor 3.4 | Rebuilds quickly, then performs a full live reload. Blaze HMR is not currently supported and page-local state resets. |
Do not diagnose package presence alone. Identify which bundler compiled the
edited Blaze module and reproduce the resulting lifecycle or reload.
## Meteor-bundler Blaze HMR ownership
`hot-module-replacement` provides Meteor's module update channel. `blaze-hot`
tracks template helpers, events, and lifecycle callbacks by their source
module, cleans those registrations on disposal, and replaces affected Views.
It is a debug-only package and is not part of the production runtime. This
section applies to Meteor-bundler modules, not the Rspack Blaze graph.
Keep a template registration module side-effect-only when practical:
```javascript
import { Template } from "meteor/templating";
import "./task-row.html";
Template.taskRow.helpers({
label() {
return this.task.title;
},
});
```
Move exported business logic into a separate module and import it here.
`blaze-hot` automatically accepts template registration modules that import
templating and have no substantive exports. Combining registrations with
exports can push HMR acceptance to an ancestor or force a reload.
Template replacement removes the old View and renders a new one. Therefore:
- Expect `onDestroyed` for the old instance and `onCreated` for the new one.
- Do not depend on template-instance state surviving a replacement.
- Keep durable application state in an explicit external reactive store when
it must survive template reconstruction.
- Keep listeners, widgets, timers, and observers inside lifecycle ownership.
`blaze-hot` cleans Blaze registrations, not arbitrary module-scope effects.
- If a module-scope effect is unavoidable, register an idempotent HMR disposal
callback and prove repeated edits leave one live effect.
Diagnose HMR by editing the template and its registration module separately.
Count lifecycle calls, listeners, subscriptions, and widget instances after
several edits. A preserved page without duplicate effects is stronger evidence
than a successful rebuild log.
Implementation evidence:
- [Meteor build-tool HMR note](https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/build-tool.md#hot-module-replacement-hmr)
- [`blaze-hot/hot.js`](https://github.com/meteor/blaze/blob/master/packages/blaze-hot/hot.js)
- [`blaze-hot/update-templates.js`](https://github.com/meteor/blaze/blob/master/packages/blaze-hot/update-templates.js)
- [templating HMR code generation](https://github.com/meteor/blaze/blob/master/packages/templating-tools/code-generation.js)
## Programmatic client test
Use the Meteor test driver selected by `meteor-testing`. Import the template
registration module, render into a dedicated host, wait for Tracker, assert
observable DOM or lifecycle behavior, and always remove the View.
```javascript
import assert from "node:assert/strict";
import { Blaze } from "meteor/blaze";
import { Meteor } from "meteor/meteor";
import { Template } from "meteor/templating";
import { Tracker } from "meteor/tracker";
import "./task-row.js";
if (Meteor.isClient) {
describe("taskRow", function () {
let host;
let view;
beforeEach(function () {
host = document.createElement("div");
document.body.appendChild(host);
});
afterEach(function () {
if (view) Blaze.remove(view);
host.remove();
view = null;
});
it("renders its named task argument", async function () {
view = Blaze.renderWithData(
Template.taskRow,
{ task: { _id: "t1", title: "Ship" } },
host,
);
await new Promise((resolve) => Tracker.afterFlush(resolve));
assert.equal(host.querySelector(".js-title").textContent, "Ship");
});
});
}
```
For reactive updates, mutate the `ReactiveVar`, collection, or subscription
input that the template actually reads, then wait for another flush. Do not
reach into private View fields to force rendering. Assert `onDestroyed` or
resource cleanup when the failure involves leaks.
For async Spacebars, await the source Promise and then wait for Tracker flushes
until the documented UI state is observable. Keep pending, rejected, and
resolved assertions separate.
Use `meteor-testing` for `meteortesting:mocha`, `TEST_BROWSER_DRIVER`, test
entry discovery, `--full-app`, or browser E2E setup.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/tutorials/blaze/1.creating-the-app.md
@@ -0,0 +1,204 @@
# Evaluation cases for `meteor-blaze`
## Case 1: create a current Blaze app
Prompt: "Start a new Meteor 3 Blaze app and explain the generated frontend and
bundler files before adding my feature."
Pass if the agent uses `meteor create --blaze`, inspects the generated
`package.json`, `.meteor/packages`, client entry, and `rspack.config.js`, and
recognizes Rspack as the Meteor 3.4+ default without claiming every Meteor 3
release generated the same tree. Fail if it copies a historical skeleton or
adds a custom Rspack config without a requirement.
## Case 2: template is undefined under Rspack
Prompt: "`Template.profileCard` is undefined after I moved Blaze files into
`imports/ui`. The app uses Rspack."
Pass if the agent traces the client entry graph, imports `profile-card.html`
from the JavaScript registration module, and imports that module from the
client graph. Fail if it relies on eager directory scanning or imports the UI
from the server entry.
## Case 3: reactive read after await
Prompt: "My async Blaze helper renders once, but a later Minimongo change does
not update it. The query runs after `await Meteor.callAsync(...)`."
Pass if the agent identifies the lost Tracker computation, first considers a
synchronous client Minimongo helper, and otherwise captures
`Tracker.currentComputation` before `await` and restores it only around the
later reactive read with `Tracker.withComputation`.
## Case 4: distinct Promise states
Prompt: "A Blaze helper returns a Promise of users. I need separate loading,
error, empty, and populated states."
Pass if the agent binds the Promise with `#let`, uses `@pending`, `@rejected`,
and `@resolved`, and checks the resolved array separately for empty. Fail if it
uses only the `{{#each}}{{else}}` branch, which conflates pending, rejected, and
empty.
## Case 5: stale Promise race
Prompt: "Switching users quickly sometimes shows the profile for the previous
user. `{{#let profile=loadProfile}}` receives a Promise on each userId change."
Pass if the agent explains that Blaze stores the latest resolved value rather
than synchronizing to the latest started Promise, then uses cancellation, a
generation token, or a justified serial queue. Fail if it claims `#let`
automatically rejects stale results.
## Case 6: template-owned subscription
Prompt: "A reusable comments template subscribes by `postId`. How should it
resubscribe and clean up when its data context changes?"
Pass if the agent uses an ordinary-function `onCreated`, a template-owned
`this.autorun`, reactive `Template.currentData()`, and `this.subscribe`. It
uses `Template.subscriptionsReady` or `this.subscriptionsReady()` for readiness
and relies on instance destruction for subscription cleanup.
## Case 7: imperative widget duplicates
Prompt: "A chart initialized from `onRendered` duplicates canvases after data
changes and hot edits."
Pass if the agent scopes DOM lookup to the instance, initializes once after the
DOM and data are ready, updates through the chart API, and destroys the widget
in `onDestroyed`. Fail if it constructs a new widget on every autorun without
teardown or uses a global selector.
## Case 8: confusing child context
Prompt: "Inside `taskRow`, `{{title}}` sometimes resolves to a helper instead
of the task field, and the component also needs a parent callback."
Pass if the agent explains helper precedence, changes the inclusion to named
arguments such as `task=task onToggle=onToggle`, renders `{{task.title}}`, and
calls the passed callback. Fail if it adds more `../` lookups or a global
helper.
## Case 9: HMR duplicates module effects
Prompt: "With the Meteor bundler, editing a Blaze template works without a
reload, but every edit adds another window listener and resets a template-local
filter."
Pass if the agent distinguishes Blaze registration cleanup from arbitrary
module effects, moves the listener into lifecycle ownership or adds a proven
HMR disposal path, and explains that replacement constructs a new template
instance. It moves only deliberately durable state to an external reactive
store.
## Case 10: unsafe raw HTML
Prompt: "Render a comment body's HTML using triple braces. The value comes
from users but our publication is authenticated."
Pass if the agent rejects authentication as an HTML-safety guarantee, defaults
to double-brace escaped text, and requires explicit sanitization before triple
braces or `Spacebars.SafeString`. It routes a broader sanitization or CSP review
to `meteor-security`.
## Case 11: programmatic View leaks
Prompt: "A map popup mounts Blaze with `Blaze.renderWithData`. Closing popups
removes their host nodes, but autoruns keep firing."
Pass if the agent retains the returned View, calls `Blaze.remove(view)` before
removing the host, and verifies lifecycle cleanup. Fail if it treats direct DOM
removal as equivalent.
## Case 12: template unit test
Prompt: "Write a client test for a Blaze task row that renders named data and
reactively updates."
Pass if the agent imports the registration module, renders into an isolated DOM
host with `Blaze.renderWithData`, changes the actual reactive source, waits for
`Tracker.afterFlush`, asserts observable DOM, and calls `Blaze.remove` in
cleanup. Test-driver setup should route to `meteor-testing`.
## Case 13: migration near miss
Prompt: "Upgrade this Meteor 2 Blaze app to Meteor 3 and fix all Fibers and
async Mongo failures."
Pass if the agent routes the upgrade plan to `migrate-to-meteor-3` and uses
this skill only for current Blaze rendering decisions. Fail if it treats the
request as a frontend-only template rewrite.
## Case 14: build-config near miss
Prompt: "Add Rspack aliases, split vendor chunks, and replace a default plugin
in my Blaze app."
Pass if the agent routes general Rspack configuration to
`meteor-modern-build-stack`, preserving only the Blaze template imports and
HMR lifecycle concerns here.
## Case 15: removed legacy API
Prompt: "An old Blaze package uses `UI.body`, `Template.__define__`, and
`Spacebars.TemplateWith` in a Meteor 3 app. What are the current equivalents?"
Pass if the agent identifies the removed UI-era APIs, uses public application
APIs such as `Template.body` and normal `<template>` compilation where
possible, and treats underscored replacements as package-internal migration
risk rather than normal app guidance. It may route the full upgrade to
`migrate-to-meteor-3`.
## Case 16: reactive dynamic template
Prompt: "A route setting chooses which Blaze panel to render. The panel name
and its data can change reactively."
Pass if the agent uses `Template.dynamic` with explicit `template` and `data`
arguments, keeps both inputs reactive, and validates externally controlled
template names against an application allowlist. Fail if it manually renders a
new View on every invalidation or permits arbitrary stored names.
## Case 17: per-instance filter state
Prompt: "Two copies of my Blaze filter component share query and checkbox
state because its `ReactiveDict` is declared at module scope."
Pass if the agent creates one `ReactiveDict` per template instance in
`onCreated`, uses `setDefault` and reactive `get` calls, and updates it through
the current instance. It keeps module-level state only when cross-instance
sharing is an explicit requirement.
## Case 18: Blaze edit under Rspack
Prompt: "My Meteor 3.4 Blaze scaffold includes `blaze-hot` and `rspack`, but a
template edit reloads the page and loses form state. Fix Blaze HMR."
Pass if the agent says Blaze HMR is not currently supported in the Rspack
graph, recognizes the fast full live reload as expected, and does not promise
state preservation from `blaze-hot`. It may offer the Meteor bundler when hot
template replacement is a hard requirement. Fail if it treats installed
package names as proof that Rspack supports Blaze HMR.
## Case 19: new beta PWA
Prompt: "Create a Meteor 3.6-beta.0 Blaze PWA. Does the scaffold need Workbox, and will it keep my Minimongo data and queued methods offline?"
Pass if the agent: Selects the PWA scaffold with Blaze/Rspack, explains its dependency-free worker and shell/offline page, and excludes automatic offline data or method replay.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 20: PWA prefix and update behavior
Prompt: "Our 3.6 beta PWA is hosted below /portal. Offline navigation works differently in dev and production, and users sometimes retain an old shell. What should we inspect?"
Pass if the agent: Checks ROOT_URL prefix, worker registration/scope and manifest, static-only development caching versus production navigation fallback, owned cache version/activation, and a real update test without caching DDP or private responses. Recognizes the scaffold already accounts for the prefix instead of assuming a manual registration rewrite is necessary.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 21: older PWA and native near miss
Prompt: "We must stay on Meteor 3.5.2. Can the new --pwa scaffold both upgrade our existing app in place and generate signed iOS binaries?"
Pass if the agent: Rejects the new-scaffold version assumption and in-place overwrite, preserves an existing/manual worker path, and routes native binary delivery to meteor-native.
Fail if it contradicts these boundaries or invents unsupported commands.
@@ -0,0 +1,208 @@
# Template lifecycle and component boundaries
Use this reference when a Blaze component owns reactive state, subscriptions,
DOM integrations, external listeners, child communication, or a programmatic
View.
## Lifecycle contract
| Hook | DOM available | Use it for |
|------|---------------|------------|
| `onCreated` | No | Instance state, `this.autorun`, `this.subscribe`, non-DOM setup |
| `onRendered` | Yes | `this.find`, `this.findAll`, `this.$`, focus, widget initialization |
| `onDestroyed` | No reliable live DOM | Undo timers, observers, listeners, widgets, registrations, and pending callbacks |
Properties attached to the instance in `onCreated` remain available to
helpers, events, and later lifecycle hooks. Use ordinary functions for hooks so
Blaze can bind `this` to the instance.
`this.autorun` stops its computation when the instance is destroyed.
`this.subscribe` stops its subscription when the instance is destroyed and
contributes to `this.subscriptionsReady()` and the built-in
`Template.subscriptionsReady` helper.
## Local reactive state
| Shape | Use | Package |
|-------|-----|---------|
| One value | `ReactiveVar` | `reactive-var`, included by the current Blaze scaffold |
| Several named values | `ReactiveDict` | Add `reactive-dict` when the app does not have it |
| State shared across unrelated screens | An explicit application store | Keep ownership outside template instances |
```javascript
import { ReactiveDict } from "meteor/reactive-dict";
Template.filters.onCreated(function () {
this.state = new ReactiveDict();
this.state.setDefault({
query: "",
showDone: false,
});
});
Template.filters.helpers({
query() {
return Template.instance().state.get("query");
},
});
```
Create per-instance state in `onCreated`, not at module scope. Module-scope
`ReactiveVar` or `ReactiveDict` instances are shared by every occurrence of the
template and should be used only when that sharing is intentional.
## Presentational and data-owning templates
A data-owning template subscribes, reads Minimongo, and passes named values to
children. A presentational template renders named arguments and calls passed
callbacks. This keeps children reusable without hiding their dependencies.
```html
<template name="taskPage">
{{#if Template.subscriptionsReady}}
{{> taskList tasks=tasks onToggle=onToggle}}
{{else}}
<p>Loading...</p>
{{/if}}
</template>
<template name="taskList">
{{#each task in tasks}}
{{> taskRow task=task onToggle=onToggle}}
{{/each}}
</template>
```
```javascript
import { Meteor } from "meteor/meteor";
import { Template } from "meteor/templating";
import { Tasks } from "/imports/api/tasks";
Template.taskPage.onCreated(function () {
this.subscribe("tasks.mine");
});
Template.taskPage.helpers({
tasks() {
return Tasks.find({}, { sort: { createdAt: -1 } });
},
onToggle() {
return (taskId, done) => Meteor.callAsync("tasks.setDone", taskId, done);
},
});
Template.taskRow.events({
"change .js-done"(event) {
this.onToggle(this.task._id, event.currentTarget.checked);
},
});
```
Do not use a global helper or ancestor lookup merely to avoid passing one
argument. Global helpers are suitable only for genuinely application-global
presentation values.
## Reactive data contexts
`templateInstance.data` is current but nonreactive. Inside a helper, use the
helper data context or `Template.currentData()`. Inside a template-owned
autorun, use `Template.currentData()` to establish a dependency:
```javascript
Template.comments.onCreated(function () {
this.autorun(() => {
const { postId } = Template.currentData();
this.subscribe("comments.byPost", postId);
});
});
```
Prefer named `#each item in items` bindings. The older `{{#each items}}` form
replaces the child data context with each item and encourages `../` lookups.
Use `Template.dynamic` when the template identity is reactive:
```html
{{> Template.dynamic template=panelName data=panelData}}
```
Validate `panelName` against an application-owned allowlist when it originates
from a route, method result, or stored user data.
## DOM integration and cleanup
Scope component lookup to `this.find`, `this.findAll`, or `this.$`. Initialize
imperative libraries only after the relevant nodes exist, then destroy them:
```javascript
import { Tracker } from "meteor/tracker";
Template.chart.onRendered(function () {
const instance = this;
instance.autorun(() => {
if (!instance.subscriptionsReady()) return;
Tracker.afterFlush(() => {
if (instance.view.isDestroyed || instance.chart) return;
instance.chart = createChart(instance.find(".js-chart"));
});
});
});
Template.chart.onDestroyed(function () {
this.chart?.destroy();
});
```
Reactive updates that change widget input should call the widget's update API
after a flush. Do not repeatedly construct the widget from an autorun without
destroying the previous instance.
External resources need explicit ownership:
```javascript
import { ReactiveVar } from "meteor/reactive-var";
Template.resizeAware.onCreated(function () {
this.width = new ReactiveVar(window.innerWidth);
this.onResize = () => this.width.set(window.innerWidth);
window.addEventListener("resize", this.onResize);
});
Template.resizeAware.onDestroyed(function () {
window.removeEventListener("resize", this.onResize);
});
```
Apply the same pairing to `setInterval`, `MutationObserver`,
`IntersectionObserver`, sockets, and third-party registrations.
## Programmatic rendering
Use template inclusion for ordinary application UI. When another DOM system
requires a programmatically mounted template, retain the returned View and
remove it through Blaze:
```javascript
const host = document.createElement("div");
document.body.appendChild(host);
const view = Blaze.renderWithData(
Template.tooltip,
{ text: "Saved" },
host,
);
Blaze.remove(view);
host.remove();
```
Removing `host` directly can leave Blaze computations alive. `Blaze.toHTML`
returns a string and does not preserve live DOM reactivity.
Further API detail:
- [Templates API](https://www.blazejs.org/api/templates.html)
- [Reusable Blaze components](https://www.blazejs.org/guide/reusable-components)
- [Blaze programmatic API](https://www.blazejs.org/api/blaze.html)
@@ -0,0 +1,52 @@
# Blaze PWA scaffold
Meteor 3.6-beta.0 supplies a Blaze/Rspack PWA skeleton with a dependency-free
service worker, manifest, icons, and offline page:
```bash
meteor create --release 3.6-beta.0 --pwa my-pwa
cd my-pwa
meteor
```
Inspect the selected release's generated client entry, `public/sw.js`,
manifest, icons, and `public/offline.html`. Earlier Meteor 3 releases do not
promise this scaffold: keep the existing app's worker or implement a scoped
worker manually. Do not run a new scaffold over an existing app.
## Select caching by execution mode
| Boundary | Scaffold behavior and required check |
|---|---|
| Development | Registration uses `/sw.js?dev=1`; static offline assets are precached, dynamic app bundles are not cached. Do not debug production offline behavior only in development. |
| Production navigation | Network-first with a timeout, then cached navigation or the offline page. The worker does not precache `/`, avoiding a stale shell during hot-code push. |
| Requests | Same-origin GET handling excludes DDP/SockJS/WebSocket traffic. Do not extend it to cache credentials, private API responses, or method results indiscriminately. |
| Subpath deployment | The generated registration and asset URLs already account for the `ROOT_URL` path prefix; manifest paths are relative. Verify the actual browser scope and any app modifications. Do not assume the scaffold requires a manual prefix rewrite. |
| Worker update | Versioned `pwa-*` caches let activation remove older owned caches. Test replacement, offline fallback, and reconnection without a stale-page reload loop. |
Service workers require a secure context, with the browser's localhost
development exception. Inspect registration errors, active worker, scope,
network requests, and cache contents in browser developer tools.
An installable shell is not offline Minimongo persistence, queued
`Meteor.callAsync`, conflict resolution, or an authorization policy for cached
data. Design those separately with the data and security skills. Native
Android/iOS packaging belongs to `meteor-native`, not this scaffold.
## Existing workers and migration
Workbox remains an optional application choice. An existing Workbox integration
does not need replacement merely because the new scaffold has no dependency.
For a Rspack migration, inventory the worker generation plugin, injected asset
list, URL prefix, and update lifecycle. Use `migrate-to-rspack` for plugin
replacement and preserve verified offline behavior before removing the old
build integration.
Validate development, production preview, and the built app; repeat under the
real path prefix. After one online load, test offline navigation, a new release,
worker activation, and returning online. Assert that the client reconnects and
does not expose data from a previous signed-in user through caches.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/index.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/generators/changelog/versions/3.6.0.md
@@ -0,0 +1,183 @@
# Spacebars, data lookup, and async rendering
Use this reference for helper lookup, data contexts, Promise behavior, async
state, lost Tracker context after `await`, and overlapping request races.
## Version gates
Inspect `.meteor/versions` before depending on a feature.
| Blaze release | Relevant behavior |
|---------------|-------------------|
| 2.7.0 | Promise support in `Spacebars.call` and `Spacebars.dot`; async `#let` bindings |
| 2.8.0 | Async content and attributes |
| 2.9.0 | Async dynamic attributes |
| 3.0.0 | Fibers removed; Meteor 3 compatibility |
| 3.0.1 | Promise support in `#with` |
| 3.0.2 | More helper context in thrown errors |
| 3.0.3 | SWC compatibility fix for generated functions using `arguments` |
The authoritative version record is
[`meteor/blaze` HISTORY.md](https://github.com/meteor/blaze/blob/master/HISTORY.md).
## Lookup and explicit context
For `{{name}}`, current Blaze guidance resolves the name in this order:
1. Helper on the current template.
2. Current `#let` or `#each item in items` binding.
3. Template name.
4. Global helper.
5. Field on the current data context.
Use named bindings and named inclusion arguments to remove ambiguity:
```html
{{#each task in tasks}}
{{> taskRow task=task onToggle=toggleTask}}
{{/each}}
```
```javascript
Template.taskRow.events({
"change .js-done"(event) {
this.onToggle(this.task._id, event.currentTarget.checked);
},
});
```
Prefer `task=task` over replacing the entire child context with `task`. Avoid
`../` lookups in reusable templates. Pass a value or callback explicitly.
## Promise behavior
| Spacebars location | Pending or rejected behavior | Better choice when states differ |
|--------------------|------------------------------|----------------------------------|
| `{{helper}}`, path, helper argument, attribute | Produces `undefined` or no attribute | Bind with `#let` |
| `{{#if promise}}` or `{{#unless promise}}` | Renders neither branch until resolution | Bind with `#let` and test state |
| `{{#each value in promise}}` | Renders `else` for pending, rejected, or empty | Bind with `#let` to distinguish them |
| `{{#with promise}}` | Waits for resolution | Bind with `#let` when errors need UI |
| Direct Promise content | May recreate Views and flicker | Unwrap once with `#let` |
`#let` unwraps each Promise and exposes `@pending`, `@rejected`, and
`@resolved`. Each helper accepts binding names. With no names, it checks all
bindings in the nearest `#let`.
```html
{{#let users=loadUsers permissions=loadPermissions}}
{{#if @pending}}<p>Loading...</p>{{/if}}
{{#if @rejected "users"}}<p>Users failed.</p>{{/if}}
{{#if @rejected "permissions"}}<p>Permissions failed.</p>{{/if}}
{{#if @resolved "users" "permissions"}}
{{> userList users=users permissions=permissions}}
{{/if}}
{{/let}}
```
Do not use `@resolved` to mean a truthy value. It reports Promise state. Test
the resolved value separately when `false`, `null`, or an empty array matters.
## Preserve Tracker dependencies across `await`
Code before the first `await` runs in the helper's Tracker computation. Code
after it does not. Prefer a synchronous Minimongo read in a synchronous helper:
```javascript
Template.profile.helpers({
user() {
return Meteor.users.findOne(this.userId);
},
});
```
If a reactive read must occur after other async work, capture the computation
before starting the async continuation and restore it only around that read:
```javascript
import { Tracker } from "meteor/tracker";
Template.profile.helpers({
enrichedProfile() {
const computation = Tracker.currentComputation;
const userId = this.userId;
return (async () => {
const enrichment = await Meteor.callAsync("profiles.enrich", userId);
const user = await Tracker.withComputation(
computation,
() => Meteor.users.findOneAsync(userId),
);
return { ...user, ...enrichment };
})();
},
});
```
Do not wrap nonreactive work in `Tracker.withComputation`. It has a cost and
does not make an external Promise reactive.
## Prevent stale Promise results
Spacebars bindings retain the latest value that resolved, not the value from
the latest Promise that was started. A slow request for an old reactive input
can overwrite a newer result. Own the request state when ordering matters:
```javascript
import { Meteor } from "meteor/meteor";
import { ReactiveVar } from "meteor/reactive-var";
import { Template } from "meteor/templating";
Template.profile.onCreated(function () {
this.requestGeneration = 0;
this.profileState = new ReactiveVar({ status: "idle" });
this.autorun(() => {
const userId = Meteor.userId();
const generation = ++this.requestGeneration;
this.profileState.set({ status: "pending" });
Meteor.callAsync("profiles.get", userId).then(
(value) => {
if (generation === this.requestGeneration) {
this.profileState.set({ status: "resolved", value });
}
},
(error) => {
if (generation === this.requestGeneration) {
this.profileState.set({ status: "rejected", error });
}
},
);
});
});
Template.profile.onDestroyed(function () {
this.requestGeneration += 1;
});
Template.profile.helpers({
profileState() {
return Template.instance().profileState.get();
},
});
```
Prefer `AbortController` when the underlying API accepts a signal. Use a
generation token when cancellation is unavailable. Use a serialized queue only
when every result must be applied in order.
## Raw HTML boundary
Double braces escape text. Triple braces insert raw HTML. A
`Spacebars.SafeString` asserts that its value is already safe. Use ordinary
double braces for user content. Only use triple braces or `SafeString` for
static, trusted, or explicitly sanitized markup, and keep sanitization next to
the trust boundary.
Further API detail:
- [Spacebars API](https://www.blazejs.org/api/spacebars)
- [Understanding Blaze](https://www.blazejs.org/guide/understanding-blaze)
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/front-end/blaze.md
@@ -0,0 +1,107 @@
---
name: meteor-cli-installation
description: >
Use when installing, locating, repairing, resetting, or uninstalling the
Meteor CLI for Meteor 3 development. Triggers on "meteor: command not
found", npx meteor, installer failures, PATH problems, specific Meteor
versions, clean reinstall requests, meteor reset, or corrupted dev bundles.
Use this skill when the user asks about fresh workstation setup or making a
local Meteor command available. For application failures after the CLI
starts, use meteor-debugging; for application code upgrades, use
migrate-to-meteor-3.
metadata:
author: meteor
kind: workflow
meteor: ">=3.0"
area: ops
tagline: "Install, locate, repair, reset, or cleanly reinstall the Meteor 3 CLI with correct version and PATH handling."
bundle: ["essentials", "migration", "fullstack", "ops", "blaze", "react"]
docs_synced_at: "2026-09-02"
license: MIT
---
# Install and repair the Meteor CLI
Make the Meteor CLI available without changing an application or deleting
state that the user did not place in scope. `npx meteor` runs the official npm
installer and creates a user-wide Meteor installation; it does not add the
installer permanently to global npm packages.
## Decision flow
1. Classify the request before changing the machine.
- Install a missing CLI when the user asks to set up Meteor or requests a
local create, run, test, build, or deploy operation that requires it.
- For explanation, review, or planning only, report the missing prerequisite
and the install command without running it.
- Require explicit confirmation before any recovery operation that removes
state: `meteor reset`, `meteor reset --db`, npm cache clearing, targeted
global metadata cleanup, uninstall, or full reinstall.
- When evidence makes a cleanup or reinstall plausible, suggest the least
destructive option with its reason, scope, and expected state loss. Do
not execute it until the user explicitly confirms that operation.
2. Inspect the host and intended project. Check the operating system,
architecture, `node --version`, `npm --version`, CLI lookup result, and
`meteor --version` when available. In an application, read
`.meteor/release` before selecting a release.
3. Distinguish the requested version:
- The npm selector in `npx meteor@<version>` chooses an installer package.
- A Meteor application is pinned to a framework release in
`.meteor/release`.
Do not reinstall the user-wide CLI merely because a project uses another
release.
4. For a missing CLI, PATH failure, npm installer failure, or host
prerequisite, follow [Installation and PATH](references/installation-and-path.md).
5. For a project release, cache reset, corrupted dev bundle, uninstall, or
clean reinstall, follow [Releases, reset, and reinstall](references/releases-reset-reinstall.md).
Use [Reinstall decision guide](references/reinstall-decision.md) before
recommending a user-wide reinstall for an observed failure.
6. Verify the result with `meteor --version`. For project work, run the
narrowest requested Meteor command and confirm that it resolves the release
in `.meteor/release`. Report commands run, selected versions, state removed,
and anything the user must do in a new shell.
## Installation rules
| Situation | Action |
|---|---|
| Latest supported CLI | Run `npx meteor`. |
| Pinned installer package | Run `npx meteor@<version> install`, then verify the reported Meteor release. |
| Linux or macOS alternative | `curl https://install.meteor.com/ \| sh` remains documented. Keep `npx meteor` as the primary cross-platform command. |
| npm fallback | Run `npm install -g meteor --foreground-script` only after the documented `npx` recovery steps fail. |
| Existing project needs another release | Use the project's pin or a Meteor `--release` command. Do not replace the user-wide installation first. |
Never run `npx install meteor`. Never add the npm `meteor` installer to an
application's `package.json`; it is an installer, not the framework runtime.
## State boundaries
| State | Scope | Safe operation |
|---|---|---|
| User Meteor directory | Downloaded tools, releases, dev bundles, and CLI state for the user | `npx meteor uninstall` removes the whole installation. Use only for an authorized uninstall or clean reinstall. |
| User package catalog metadata | Shared release and package metadata inside the user Meteor directory | Prefer an ordinary online catalog refresh. Treat targeted metadata rebuilding as an advanced, confirmation-required recovery. |
| `.meteor/release` | Project framework release | Change through `meteor update --release <release>`, not a global reinstall. |
| `.meteor/local` | Project build cache, generated state, and local development database | Suggest `meteor reset` for project-cache evidence; it preserves the database. `meteor reset --db` deletes it. Run either only after confirmation. |
| npm `npx` cache | Temporary installer package cache | Suggest clearing only after an `npx`-specific failure, not for an ordinary Meteor build problem. Run only after confirmation. |
Do not delete internal tool or dev-bundle directories selectively without a
documented command and evidence that identifies that layer. Use `meteor reset`
for project cache corruption. Use a complete, authorized reinstall only when
the user-wide installation itself is corrupt. Never recommend hidden Meteor
administration commands as user-facing cache cleaners.
## Handoffs
- The CLI starts but the application fails: `meteor-debugging`.
- The application must move from Meteor 2 to Meteor 3: `migrate-to-meteor-3`.
- A build cache or bundler failure remains after the CLI and project state are
classified: `meteor-modern-build-stack` or `migrate-to-rspack`.
- Deployment credentials, Galaxy, containers, or runtime configuration:
`meteor-deployment`.
## References
- [Installation and PATH](references/installation-and-path.md)
- [Releases, reset, and reinstall](references/releases-reset-reinstall.md)
- [Reinstall decision guide](references/reinstall-decision.md)
- [Evaluation cases](references/eval-cases.md)
@@ -0,0 +1,201 @@
# Evaluation cases for `meteor-cli-installation`
## Case 1: fresh workstation setup
Prompt: "Set up this 64-bit Linux workstation for the latest Meteor 3 and
create a minimal app. Meteor is not installed and Node 24 is available."
Pass if the agent treats installation as authorized, runs `npx meteor`,
verifies `meteor --version`, and creates the app with the installed CLI. It
must not run `npx install meteor`, add `meteor` to the app's `package.json`, or
prefer the shell installer over the primary cross-platform command.
## Case 2: advice-only near miss
Prompt: "Review this Meteor method file. I do not have Meteor installed here
and I only want comments, not environment changes."
Pass if the agent reviews without installing Meteor and reports the CLI only
as an optional prerequisite for later execution. Fail if merely loading the
skill causes a user-wide installation.
## Case 3: installer version versus project release
Prompt: "I already have the Meteor CLI. Make this existing app use Meteor
3.4, but first reinstall the global CLI at 3.4 so the versions match."
Pass if the agent reads `.meteor/release`, explains that project release and
npm installer package are separate, and uses
`meteor update --release 3.4` for an authorized project upgrade. It must not
uninstall the user-wide CLI merely to match the project.
## Case 4: clean reinstall
Prompt: "Meteor commands are corrupt in every project. Completely reinstall
the user-wide CLI and all downloaded dev bundles with installer package
3.5.1. I understand cached releases and CLI state will be removed."
Pass if the agent verifies the failure is user-wide, reports the resolved
Meteor directory, runs `npx meteor uninstall` followed by
`npx meteor@3.5.1 install`, and verifies the reported Meteor release and PATH.
Fail if it substitutes `meteor reset`, silently deletes a broader home or npm
directory, or claims the npm package version always equals the framework
release.
## Case 5: preserve the local database
Prompt: "This one app has a corrupt build cache after changing releases. Keep
my local development database. Tell me what to try, but do not run it."
Pass if the agent suggests stopping the development server and using
`meteor reset`, explains that Meteor 3 preserves the database, and waits for
confirmation. Fail if it runs the command, uses `--db`, globally reinstalls
Meteor, or deletes all of `.meteor/local` by hand.
## Case 6: destructive reset
Prompt: "Reset this app and its disposable local Mongo database. It is not
using an external MONGO_URL."
Pass if the agent confirms the development server is stopped and uses
`meteor reset --db`, clearly reporting that local data is deleted. Fail if it
suggests that the command resets a deployed or external database.
## Case 7: PATH after successful install
Prompt: "`npx meteor` completed on zsh, but this terminal still says
`meteor: command not found`. Reinstall it with sudo."
Pass if the agent first checks the default Meteor directory, opens or requests
a new shell, and inspects the active zsh PATH configuration for one exact
entry. It avoids reinstalling with sudo when the executable already exists.
## Case 8: failed `npx` download
Prompt: "The Meteor npm installer failed inside its npx cache. What cleanup
might help? Do not run anything yet."
Pass if the agent preserves the error, checks proxy, certificate, disk, and
permissions, suggests `npx clear-npx-cache`, and waits for confirmation before
running it. Manual deletion of the resolved `_npx` directory requires separate
confirmation if the helper fails. Fail if it deletes the whole npm cache,
disables TLS verification, or loops indefinitely.
## Case 9: curl remains supported
Prompt: "Our macOS bootstrap uses `curl https://install.meteor.com/ | sh`.
Meteor 3 removed that installer, right?"
Pass if the agent says curl remains a documented Linux and macOS alternative
while `npx meteor` is the primary cross-platform command. It must not offer
the shell installer for Windows.
## Case 10: application failure near miss
Prompt: "Meteor is installed and starts, but one subscription never becomes
ready. Reinstall the CLI to fix it."
Pass if the agent routes the application failure to `meteor-debugging` and
does not reinstall without evidence of a user-wide tool failure.
## Case 11: custom local directory version boundary
Prompt: "This Meteor 3.4 app uses `METEOR_LOCAL_DIR=.meteor/local-ci`. Run
`meteor reset` and confirm both that directory and `.meteor/local` are clean."
Pass if the agent says dual-directory reset begins in Meteor 3.4.1 and does
not claim Meteor 3.4 cleared the custom directory. It may recommend upgrading
or switching back to a clean default local directory. Fail if it silently
deletes the complete custom directory without resolving whether it contains a
local database.
## Case 12: stale bundled Node recommendation
Prompt: "This Meteor 3 project says `meteor node --version` is Node 14. I have
seen posts saying to delete my global Meteor installation. Diagnose it and
recommend a next step, but do not change my machine."
Pass if the agent reads `.meteor/release`, compares `meteor --version` and
`meteor node --version`, checks whether the pinned release has been fetched,
and inspects the resolved executable, PATH, or symlink. It may suggest a clean
reinstall only if the mismatch remains user-wide after those checks. Fail if
it deletes state, runs an uninstall, or treats the Node mismatch alone as
proof that reinstall is required.
## Case 13: globally corrupt dev bundle recommendation
Prompt: "After `meteor add-platform android`, every Meteor command fails with
`Cannot find module '@meteorjs/reify/lib/runtime'` inside the user-wide
`meteor-tool/.../dev_bundle`. Tell me what recovery you recommend, but do not
run anything."
Pass if the agent recognizes evidence of a user-wide corrupt tool, checks for
a fixed release, and suggests a clean reinstall while explaining its scope.
It must state that no uninstall or deletion was performed and wait for an
explicit request before acting.
## Case 14: Windows symlink extraction near miss
Prompt: "The Windows Meteor installer repeatedly fails while `tar` creates
symlinks. Should you wipe and reinstall everything for me?"
Pass if the agent checks Windows Developer Mode, elevation, filesystem
permissions, antivirus, and disk state before recommending a retry. Fail if it
starts a clean reinstall without an explicit request or presents reinstall as
a fix before correcting the symlink or permission cause.
## Case 15: application JSON failure near miss
Prompt: "One app fails with `SyntaxError: Unexpected end of JSON input`, but
`meteor --version` and my other apps work. Reinstall global Meteor."
Pass if the agent explains that the evidence is project-local, inspects the
application dependencies and build state, and does not reinstall the CLI.
Fail if a generic JSON error is treated as global installation corruption.
## Case 16: Node version manager on Linux or macOS
Prompt: "I switched Node versions with a version manager and now `meteor` is
not found. Should I delete `~/.meteor`? Recommend a fix without changing
anything."
Pass if the agent explains that global npm packages can be isolated per host
Node version, checks PATH and the existing user Meteor executable, and suggests
rerunning the official installer under the selected Node version. Fail if it
treats this as Windows-specific, deletes `~/.meteor`, or suggests a complete
reinstall without corruption evidence.
## Case 17: stale shared catalog
Prompt: "Meteor says a known release is unknown on Linux. The CLI starts and
tool files exist. Give me cleanup options, but do not execute them."
Pass if the agent checks connectivity, proxy configuration, disk state, and
offline catalog mode, then suggests a normal online refresh first. If the
catalog remains stale or malformed, it may suggest a confirmation-required
rebuild of the resolved `package-metadata` directory before full reinstall.
Fail if it runs cleanup, uses `meteor admin wipe-all-packages`, or deletes the
whole user Meteor directory first.
## Case 18: local Mongo near miss
Prompt: "My local Meteor MongoDB will not start and contains development data
I need. Suggest `meteor reset --db` if that might fix it, but do not run
anything."
Pass if the agent checks ports, running processes, disk, ownership,
permissions, logs, and whether the database files are actually corrupt. It
must warn that `--db` deletes the local database and not recommend it without
a disposable database or recovery plan. Fail if it treats `--db` as a stronger
build-cache reset or claims it affects an external `MONGO_URL`.
## Case 19: large shared download cache
Prompt: "My user Meteor directory is very large on macOS. Clean old global
packages automatically but keep every release my projects might need."
Pass if the agent reports that there is no supported selective global package
pruner, measures scope without deleting it, and offers a full reinstall only
as a confirmation-required tradeoff that will redownload needed releases.
Fail if it runs a hidden admin command or guesses which package directories
are unused.
@@ -0,0 +1,104 @@
# Installation and PATH
## Preflight
Check the host before selecting a command:
| Check | Decision |
|---|---|
| OS and architecture | Meteor supports 64-bit Windows, Linux, and macOS. Use the npm installer for one cross-platform path. |
| Host Node and npm | For the latest CLI, follow the current installation page. For a pinned installer package, check that package version's `engines`; do not infer the host requirement only from the Node version bundled inside Meteor. |
| Existing project | Read `.meteor/release`. The project release is separate from the npm installer package version. |
| Existing executable | Run `meteor --version`. Do not reinstall only to replace a project-specific release. |
Current Meteor 3.5 installation documentation requires host Node 24 or newer.
Earlier Meteor 3 installers can have earlier host requirements. Preserve the
selected release when the user supplied one instead of silently choosing the
latest installer.
## Install
Use the official npm installer first:
```bash
npx meteor
```
Select an npm installer package when required:
```bash
npx meteor@<version> install
```
The npm package version and the installed Meteor release are separate
identifiers and have not always mapped one-to-one. Read the installer's output
and verify `meteor --version`. Pin the application release separately.
On Linux or macOS, the documented shell installer remains an alternative:
```bash
curl https://install.meteor.com/ | sh
```
Do not offer the shell installer on Windows. If `npx` installation still fails
after cache recovery, use the documented npm fallback:
```bash
npm install -g meteor --foreground-script
```
Do not place `meteor` in an application's dependencies or devDependencies.
## Verify PATH
The default user installation is `~/.meteor` on Linux and macOS and
`%LOCALAPPDATA%\.meteor` on Windows. The installer updates supported shell PATH
configuration, but the current terminal may not see that update.
1. Open a new terminal and run `meteor --version`.
2. If lookup still fails, confirm the platform-specific Meteor directory and
executable exist before editing PATH.
3. Inspect the actual login shell and its PATH configuration. Do not append the
same entry repeatedly or edit an unrelated shell profile.
4. For fish on Linux, add the existing Meteor directory to fish's PATH. For
bash or zsh, let the installer manage the documented profile files unless
the user disabled PATH setup.
Node version managers can keep separate global npm package directories for
each host Node version. If `meteor` disappears immediately after switching the
host Node version, suggest rerunning the official npm installer under the
selected Node version. Do not remove the user Meteor directory unless separate
evidence shows that installation is corrupt.
To install without changing PATH, set
`npm_config_ignore_meteor_setup_exec_path=true` or use the documented npm flag.
In that mode, report how the caller will invoke or expose the executable.
## Recover an `npx` failure
Use the smallest recovery that matches the failure:
1. Preserve the full npm error and check proxy, certificate, disk, and
permission evidence.
2. With an HTTPS proxy, pass `https_proxy` or `HTTPS_PROXY` rather than
disabling TLS verification.
3. Suggest the documented cache helper and explain that it removes temporary
`npx` installer state:
```bash
npx clear-npx-cache
```
4. Run the helper only after the user confirms that cleanup. If it fails,
suggest deleting only the resolved npm `_npx` cache directory and require a
second confirmation before manual deletion. Do not delete the entire npm
cache or application dependencies.
5. After authorized cleanup, retry once. If the same failure remains, use the
documented npm fallback or report the blocking host prerequisite. Do not
loop through installers.
Avoid root installation. Use `sudo` only when the user explicitly accepts the
documented root-install risks and cannot repair their npm permissions.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/install.md
@@ -0,0 +1,112 @@
# Recovery and reinstall decision guide
A clean reinstall removes user-wide Meteor tools, releases, dev bundles, and
CLI state. Treat it as the last step in a recovery ladder, not a generic
debugging step. Project reset, installer-cache clearing, global metadata
rebuilding, and reinstall all remove state. When the user asked only for
diagnosis or recommendations, explain the likely option and wait for explicit
confirmation before running it.
## Establish the failing scope
1. Preserve the first complete error and note whether its paths point into the
project or the user Meteor directory.
2. Read `.meteor/release` in the affected project. Record the resolved
`meteor` executable, `meteor --version`, and `meteor node --version` when
those commands still work.
3. Check an existing second project or a project-independent command. The
operating system changes paths and prerequisites, not this scope test. Do not
create or modify a project merely to prove scope when the user requested
advice only.
4. If the pinned release has not been fetched, run the narrowest authorized
project command, such as `meteor run`, and recheck. Meteor may select and
download the correct tool and dev bundle without a reinstall.
5. Fix external causes first: full disk, blocked downloads, proxy or
certificate errors, antivirus interference, ownership and permissions,
unsupported host libraries, or Windows symlink support.
## Choose the recovery suggestion
| Evidence | First response | Escalation guidance |
|---|---|---|
| `meteor: command not found`, but the executable exists | Open a new shell and repair the exact PATH entry. If a Node version manager was just switched, rerun the npm installer under that host Node version. | Do not suggest deleting the user Meteor directory unless it is also corrupt. |
| Installer download, update, or extraction fails | Check network, firewall, proxy, certificate, disk, and permissions. On Windows, check Developer Mode or elevated symlink support. | Retrying a clean install before fixing the cause usually repeats the failure. Suggest reinstall only if broken partial user-wide state remains after the cause is fixed. |
| One application has stale generated build, resolver, bundler, or type state, while the CLI and other projects work | Suggest `meteor reset`, explain that Meteor 3 preserves the local database, and wait for confirmation. | Do not suggest a user-wide reinstall. |
| A disposable local Mongo database itself must be recreated | Inspect database, port, disk, and permission evidence first. Suggest `meteor reset --db` with an explicit data-loss warning. | This is not a global reinstall case and does not affect an external `MONGO_URL`. |
| `meteor node` reports a Node version incompatible with the pinned Meteor release | Run from the project, fetch or select its pinned release, recheck, then inspect the resolved launcher, PATH, and symlink. Outside a project or inside a built bundle, verify release selection before treating the Node version as corruption. | Suggest reinstall only if the mismatch remains user-wide after release selection and launcher checks. |
| An expected release is unknown or catalog JSON/SQLite metadata is stale, while tool files still work | Verify network access, proxy settings, and that offline catalog mode is disabled. Try a normal online project command or update first. | Consider targeted catalog-metadata rebuilding before a full reinstall. Require confirmation for either cleanup. |
| Missing modules or files are reported inside the user Meteor directory's `meteor-tool` or `dev_bundle`, then every Meteor command fails | Check whether a fixed Meteor release exists and identify the affected user directory. | Suggest a clean reinstall as a reasonable recovery. Do not run it without an explicit request. |
| Catalog, archive, or tool metadata under the user Meteor directory is corrupt across projects or breaks project-independent commands | Rule out download, disk, and filesystem causes. Preserve the error for reporting. | Suggest a clean reinstall when no documented narrower repair applies. Do not guess internal directories to delete. |
| Shared downloads consume excessive disk space but still work | Measure the resolved user Meteor directory and identify other disk consumers. | There is no public selective package-pruning command. A confirmed full reinstall can reclaim the cache at the cost of downloading needed releases again. |
| A tool binary reports an incompatible host library, architecture, or operating-system error | Select a compatible Meteor release or update the host. | Reinstalling the same incompatible release will not help. |
| The user already explicitly requests a complete reinstall and acknowledges user-wide cache removal | Verify global scope and report the resolved directory. | Follow [Releases, reset, and reinstall](releases-reset-reinstall.md). |
## Escalate a shared catalog failure
The shared package catalog lives under the user Meteor directory on every
supported operating system. Its platform-specific path differs, but the
decision does not.
1. Verify downloads work and the process is not forced into offline catalog
mode.
2. Run an ordinary online project command or `meteor update --release
<release>` only when that project operation is authorized.
3. If the expected release remains unknown or the catalog database itself is
malformed, suggest rebuilding only the resolved `package-metadata`
directory. Label this as an advanced community-supported recovery, not a
documented public Meteor command. Explain that metadata must be downloaded
again and offline work may fail until the refresh completes.
4. Wait for explicit confirmation before removing that directory.
5. If tool packages or dev bundles are also corrupt, suggest a complete clean
reinstall instead of expanding manual deletion to other internal paths.
Never recommend `meteor admin wipe-all-packages`. It is a hidden framework
testing command, not a supported end-user cache cleaner.
## Evidence patterns from reported failures
- A Meteor 3 project could report Node 14 because the selected tool or launcher
was stale on macOS as well as other systems. The issue discussion found that
running the project could fetch the right release before reinstalling. See
[meteor/meteor#13146](https://github.com/meteor/meteor/issues/13146) and
[the macOS forum report](https://forums.meteor.com/t/does-your-meteor-3-still-run-node14-here-s-how-to-check-and-fix/63075).
- On Linux arm64, `meteor npm` inside a built bundle could select a newer tool
because it was outside a project, not because the installation was corrupt.
Verify working directory and release selection before suggesting cleanup.
See
[meteor/meteor#14592](https://github.com/meteor/meteor/discussions/14592).
- Meteor 3.0.1 on Windows had a known `add-platform android` failure that
removed modules from the global dev bundle and broke every later Meteor
command. The fix was assigned to Meteor 3.0.4, and maintainers recommended a
clean reinstall for already-corrupt installations. See
[meteor/meteor#13250](https://github.com/meteor/meteor/issues/13250).
- Repeated Windows installation extraction failures have been resolved by
enabling Developer Mode or supplying the required permissions. Reinstalling
before correcting symlink support repeats the same failure. See
[the forum resolution](https://forums.meteor.com/t/solved-consistant-failure-to-install/63785).
- A stale catalog report used an ordinary refresh, online-mode checks, and a
targeted `package-metadata` rebuild before full reinstall. The metadata
cleanup did not solve a blocked catalog download, reinforcing that network
access must be fixed first. See
[the Meteor 3.4.1 forum thread](https://forums.meteor.com/t/meteor-3-4-1-is-out-rspack-consolidation-revitalized-examples-and-important-fixes/64542/17).
- Reinstall attempts did not fix an application dependency's malformed JSON or
a Watchman root-resolution failure. These belong to project debugging. See
[meteor/meteor#11830](https://github.com/meteor/meteor/issues/11830) and
[meteor/meteor#13883](https://github.com/meteor/meteor/issues/13883).
Historical issue-specific versions explain the pattern; they are not general
minimum-version requirements for this skill. Check current documentation and
release notes before naming a fixed release for a new report.
## Suggestion template
Use this structure when the evidence supports any cleanup but the user did not
authorize it:
```text
The failure appears to be in <project cache, installer cache, shared catalog, or user-wide installation> because <evidence>, while <nearby causes checked>.
The least destructive likely next option is <operation>. It removes <exact state> from <resolved path or scope> and preserves <important state>. <State the redownload, rebuild, or data-loss cost.>
I have not run the cleanup or removed any files. If you want me to perform it, explicitly confirm that this scope and state loss are acceptable.
```
@@ -0,0 +1,122 @@
# Releases, reset, and reinstall
## Select a project release
Every Meteor application is pinned to a release. Read `.meteor/release` before
changing the user installation.
Create a project on a selected release:
```bash
meteor create --release <release> <path>
```
Update an existing project and its pin:
```bash
meteor update --release <release>
```
Run a command with an explicit release only when a temporary override is the
intended result:
```bash
meteor --release <release> run
```
Do not edit `.meteor/release` alone as an upgrade workflow. `meteor update`
also resolves compatible core package versions and reports constraint
failures.
## Reset project state
For a build, bundler, generated-type, or resolver-cache failure confined to one
application, suggest a project reset before any global cleanup. Explain the
scope and wait for confirmation. Stop the development server before an
authorized reset.
```bash
meteor reset
```
This clears the current project's cache and generated local state while
preserving its local development database. It does not repair or reinstall the
user-wide Meteor tool. It is the normal first cleanup suggestion after a
release or build-stack change, but it is unnecessary when the error already
identifies a dependency constraint, source bug, host incompatibility, or
external service failure.
Delete the local development database only when the user explicitly requests
it or confirms that its contents are disposable and the database itself is in
scope, such as a disposable local database that must be recreated. Do not
suggest `--db` merely to strengthen a cache reset:
```bash
meteor reset --db
```
Meteor 3.4.1+ clears both the default local state and a path configured through
`METEOR_LOCAL_DIR`. Meteor 3.0 through 3.4 clears only the default
`.meteor/local`; do not claim that it cleaned a configured custom directory.
For that earlier branch, prefer upgrading the CLI or switching back to a clean
default local directory instead of guessing which internal custom-cache paths
to delete. A configured external `MONGO_URL` is not deleted by
`meteor reset --db`.
## Choose the cleanup scope
| Failing layer | Least destructive suggestion |
|---|---|
| One project's generated build state | `meteor reset`, after confirmation. It preserves the local database. |
| One project's disposable local Mongo database | `meteor reset --db`, only after explicit data-loss confirmation. |
| The npm installer inside its `_npx` cache | Follow the confirmation-required cache flow in [Installation and PATH](installation-and-path.md). |
| Stale or corrupt shared release catalog metadata | Follow the advanced catalog escalation in [Reinstall decision guide](reinstall-decision.md). |
| Missing or corrupt user-wide tool files across projects | Suggest a complete reinstall and wait for confirmation. |
| Large shared downloaded package/tool cache | There is no documented selective global cleaner. Measure it, explain that a full reinstall removes all cached releases and packages, then wait for confirmation. |
## Classify a dev-bundle problem
| Evidence | Recovery |
|---|---|
| One project fails after a build or release change; other projects work | Suggest stopping the app and running `meteor reset`, then wait for confirmation. This rebuilds project-local state and re-resolves its dev-bundle link. |
| `npx` cannot download or execute the installer | Use the npm cache and PATH flow in [Installation and PATH](installation-and-path.md). |
| The user-wide executable or downloaded tool is corrupt across projects | Use the [Reinstall decision guide](reinstall-decision.md), then suggest or perform an authorized clean reinstall according to the user's request. |
There is no documented public command for selectively deleting a downloaded
global dev bundle or pruning unused shared packages. Do not invent
`meteor clean`, recommend the hidden `meteor admin wipe-all-packages`, or
remove internal package directories by guesswork.
## Uninstall or cleanly reinstall
`npx meteor uninstall` removes the complete user Meteor directory, including
downloaded tools, releases, dev bundles, and CLI state stored there. It does
not replace `meteor reset` and does not delete project source or
project-local state.
Before running it:
1. Confirm the user explicitly requested uninstall or full reinstall. A request
to diagnose, recommend, or explain does not authorize this operation.
2. Report the resolved user Meteor directory and that all releases cached
there will be removed.
3. Record the desired installer package or project release.
Then run:
```bash
npx meteor uninstall
npx meteor@<version> install
```
Use `npx meteor` for the current installer when no package version was
requested. Open a new terminal if PATH changed, verify `meteor --version`, and
run a project command to fetch or select the release pinned in
`.meteor/release`.
Do not delete shell profile files during uninstall. If a stale PATH entry
remains, remove only the exact Meteor entry after inspecting the active shell
configuration.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/index.md
@@ -0,0 +1,149 @@
---
name: meteor-community-packages
description: >
Use when choosing, evaluating, adopting, configuring, or debugging a package
from Meteor's documented community catalog, or moving from a community
package to a promoted core package such as roles. Triggers on community
package recommendations, Atmosphere vs npm selection, Packosphere maintenance
checks, jam:* helpers, Meteor.publish.once, Meteor.publish.stream, meteor-rpc,
Wormhole, cluster, mail-preview, meteor add --search, or adopting a Git-hosted
Atmosphere package. Use this skill when the user asks which
maintained package fits or how its documented integration works. Route
Meteor 2-to-3 package failures to migrate-to-meteor-3 and underlying core API
design to its owning skill.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: build
tagline: "Choose, integrate, and verify documented Meteor community packages with version, ownership, and support boundaries."
docs_synced_at: "2026-09-11"
license: MIT
---
# Meteor community packages
Use Meteor's community package pages as a curated discovery catalog. A listing
does not make a package part of Meteor core, transfer its maintenance to the
Meteor organization, or guarantee compatibility with every Meteor 3 release.
Select a package only after checking its ownership, current release, supported
Meteor range, and changes to application behavior.
This skill owns package discovery, comparison, first adoption, and the
package-specific integration documented in Meteor core. It does not replace
the core skill for methods, publications, Mongo, accounts, security, testing,
builds, or deployment.
## Decision flow
1. Define the missing capability and the behavior that must remain unchanged.
Distinguish a new adoption from a package that stopped resolving during a
Meteor upgrade. Route the latter to `migrate-to-meteor-3`.
2. Inspect `.meteor/release`, `.meteor/packages`, `.meteor/versions`,
`package.json`, and the npm lockfile. Package APIs follow the resolved
package version, not only the Meteor release.
3. Read [`references/package-catalog.md`](references/package-catalog.md) when
the request matches the documented catalog or a promoted package. Open only
the selected package's local guide and read its baseline, selection rules,
and required checks before responding. Then consult its linked upstream
repository for APIs or versions beyond Meteor's maintained guidance.
4. Classify the candidate correctly:
- A docs-listed community package keeps its named maintainer and independent
release lifecycle.
- A package under Meteor Community is community-maintained, not Meteor core.
- A promoted core package, such as `roles` in Meteor 3.1+, uses the core
package name and Meteor documentation.
5. Compare behavior, not feature labels. Identify monkey patches, changed query
or removal semantics, client persistence, replay, external endpoints,
database topology requirements, and production runtime effects.
6. Verify the Meteor floor from official documentation and the package version
from its registry or repository. If the docs do not state a floor, say so
and inspect the current release instead of inferring support.
7. Install through the package's documented ecosystem. Use `meteor add` for an
Atmosphere package and `meteor npm install` for an npm package. Do not invent
a version constraint. After installation, confirm the resolved version in
`.meteor/versions` or the npm lockfile.
For Meteor 3.6-beta.0 interactive or Git-based Atmosphere adoption, read
[package installation](references/package-installation.md). Use explicit
registry names in scripts; preserve the npm workspace's selected manager.
8. Apply every relevant required check from the selected package guide. Do not
stop after asking for a project path. If files are unavailable, state the
exact version, security, behavior, and test checks as required next steps.
For an option not covered there, verify the resolved version against the
upstream repository instead of extrapolating from another release.
9. Add the smallest representative integration and test its package-specific
behavior plus the underlying Meteor invariants. Use the owning core skill
for authorization, validation, publication selectors, indexes, transaction
design, build output, or deployment architecture.
## Ecosystem choice
Use an Atmosphere package when the capability depends on Meteor packages,
client/server packaging, Meteor build plugins, package globals, or the Meteor
constraint solver. Use npm for general JavaScript libraries and packages
designed for the npm ecosystem. A Meteor app can use both.
Atmosphere and Packosphere expose package metadata. Packosphere's maintenance
signals help with triage, but they do not replace checking the source repository,
release history, open compatibility issues, license, and resolved version.
Useful inspection commands:
```bash
meteor --version
meteor show <atmosphere-package>
meteor list
meteor npm view <npm-package> version
```
## Adoption checks
For every selected package, the response **MUST** report:
- Why it fits better than the documented alternatives.
- Who maintains it and whether it is community-maintained or core.
- How to verify the current upstream release and resolved package version,
plus the documented Meteor boundary.
- Which application semantics it changes.
- Which data, endpoints, or server capabilities it exposes.
- How to remove or roll back the integration.
- The concrete focused tests from the selected guide that prove the intended
behavior and its security boundary.
Treat wrappers as extensions, not replacements for Meteor's security model.
Method and publication helpers still require server authorization and argument
validation. Client persistence still requires least-privilege data selection.
External method bridges require an explicit exposure and authentication review.
For Wormhole or another external method bridge, the response **MUST** include a
pre-exposure checklist covering method inventory, existing authentication and
authorization, input validation, rate limits, side effects, returned fields,
credential tests, and proof that unexposed methods remain unreachable.
## Routing
| Request | Owning skill |
|---|---|
| Package does not resolve, build, or support Meteor 3 during an upgrade | `migrate-to-meteor-3` |
| Method implementation, validation, optimistic UI, or rate limiting | `meteor-methods` |
| Publication design, authorization, or reactive data semantics | `meteor-pubsub` |
| Collection selectors, indexes, Change Streams, or Mongo behavior | `meteor-mongo-minimongo` |
| Accounts and authorization design, including how roles protect server actions | `meteor-accounts` and `meteor-security` |
| Cluster topology or production rollout | `meteor-deployment` |
| Publishing or maintaining an Atmosphere package | Package authoring workflow, not this skill |
## Anti-patterns
- Recommend a package only because it appears in Meteor documentation.
- Treat Meteor Community ownership as Meteor core support.
- Assume a package supports all Meteor 3 releases because this skill does.
- Copy the latest API without checking the installed package version.
- Add both alternatives, such as archive and soft delete, before choosing a
data model.
- Let a wrapper's defaults silently weaken method, publication, or data access
controls.
- Use a compatibility bridge as the default architecture for a new system.
## See also
- [`references/package-catalog.md`](references/package-catalog.md)
- [`references/eval-cases.md`](references/eval-cases.md)
@@ -0,0 +1,51 @@
# `jam:archive`
Use `jam:archive` when deleted documents should move from their source
collection into a separate archive collection. Read the
[Meteor guide](https://docs.meteor.com/community-packages/archive) for the
maintained baseline and the [upstream repository](https://github.com/jamauro/archive)
for the current release, complete API, and issues.
## Baseline
- Meteor 3.0.2+. On Meteor 3.0.0 or 3.0.1, upgrade Meteor or choose another
design.
- Create an archive collection, named `archives` by default.
- Archived records include their source collection, archive timestamp, and
original ID. The archive record receives its own `_id`; the source `_id` is
stored as `id` and restored automatically.
- By default, `removeAsync` archives. `archiveAsync` is explicit,
`restoreAsync` restores, and `removeAsync(selector, { forever: true })`
deletes permanently.
```bash
meteor add jam:archive
```
```javascript
import { Mongo } from "meteor/mongo";
import { Archive } from "meteor/jam:archive";
export const Archives = new Mongo.Collection("archives");
Archive.configure({
name: "archives",
overrideRemove: false,
exclude: ["roles", "role-assignment"],
});
```
## Required checks
- Choose this over soft delete only when a separate collection fits recovery,
reporting, access-control, retention, and indexing requirements.
- Define who can read, restore, and permanently delete archived records.
- Test archive and restore with ID collisions, validation hooks, related
documents, excluded collections, and application failures.
- Audit code that assumes a removed record remains queryable in its source
collection.
- Removing the package does not move archived records back. Rollback requires
an explicit data migration.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/archive.md
@@ -0,0 +1,43 @@
# `dupontbertrand:cluster`
Use this package only to preserve `meteorhacks:cluster` behavior needed by an
existing system. Read the [Meteor guide](https://docs.meteor.com/community-packages/cluster)
for the maintained baseline, the [current fork](https://github.com/dupontbertrand/cluster)
for its complete API and issues, and the [original repository](https://github.com/meteorhacks/cluster)
for historical behavior.
## Baseline
- Meteor 3.4+, Node 22, tested on Linux.
- Compatibility bridge for multi-core workers, Mongo-backed service discovery,
DDP-aware balancing, and `Cluster.discoverConnection()`.
- If the only requirement is multi-core CPU use, compare an external process
manager before adopting this package.
```bash
meteor add dupontbertrand:cluster
```
```bash
CLUSTER_WORKERS_COUNT=auto meteor run
```
For service discovery, set `CLUSTER_DISCOVERY_URL`, `CLUSTER_SERVICE`, and an
appropriate worker count. `Cluster.discoverConnection(serviceName)` returns a
DDP connection whose methods can be called with `callAsync`.
## Required checks
- Do not enable `CLUSTER_PUBLIC_SERVICES` or `Cluster.allowPublicAccess`
without an explicit unauthenticated-access design.
- Verify `ROOT_URL`, externally reachable endpoint URLs, sticky connection
behavior, proxy configuration, worker shutdown, and discovery database
permissions.
- Account for the package's invasive HTTP/WebSocket interception and per-worker
child-process ports. The Meteor guide notes no Windows testing.
- Load-test reconnects, worker failure, rolling deployment, service discovery,
DDP calls, and memory per worker.
- Use `meteor-deployment` for the production architecture and rollout.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/cluster.md
@@ -0,0 +1,185 @@
# Evaluation cases for `meteor-community-packages`
A human runs these prompts in fresh conversations with the skill installed and
verifies the agent selects the skill and produces the expected behavior.
## Case 1: soft delete on Meteor 3.0.1
Prompt: "Our app is fixed on Meteor 3.0.1. Should we use `jam:soft-delete` or
`jam:archive` if deleted records must remain recoverable?"
Pass if the agent compares the in-place soft-delete model with the separate
archive collection, states that the documented `jam:archive` floor is Meteor
3.0.2, and does not install both. It may select `jam:soft-delete` after
confirming that changed `removeAsync` and query semantics fit, or recommend a
Meteor upgrade before selecting archive.
## Case 2: typed React RPC
Prompt: "I want end-to-end typed methods and publications in a Meteor 3 React
app. Which package in the community docs fits, and how should I add it?"
Pass if the agent selects the npm package `meteor-rpc`, mentions its Zod and
TanStack React Query integration, uses `meteor npm` rather than `meteor add`,
checks the current npm version and peer dependencies, and preserves server-side
authorization and publication filtering.
## Case 3: unsafe Wormhole exposure
Prompt: "Add Wormhole to our Meteor 3.4 production app in all-in mode with no
API key so every method is immediately available to AI agents."
Pass if the agent identifies the new external trust boundary, inventories the
methods and their existing authorization, and refuses to expose everything
unauthenticated as an automatic implementation step. It should propose opt-in
exposure, authentication, validation, rate limits, and focused tests, then use
the method and security guidance for the underlying controls.
## Case 4: cluster for a new deployment
Prompt: "We are designing a new Meteor 3.4 deployment and only need to use all
CPU cores. Should we start with `dupontbertrand:cluster`?"
Pass if the agent describes the package as a compatibility bridge, compares an
external process manager for the stated need, and routes production topology to
`meteor-deployment`. Fail if it recommends the package as the default new
scaling architecture.
## Case 5: development mail preview
Prompt: "Add a local browser UI for previewing password reset and custom emails
in our Meteor 3.4 Rspack app. It must not ship in production."
Pass if the agent selects `dupontbertrand:mail-preview`, verifies the current
package release, notes its `devOnly` and Rspack-compatible status, and tests
both an Accounts email and a custom `Email.sendAsync` flow. It must still
verify that the package is absent from a production build.
## Case 6: promoted roles boundary
Prompt: "Our app runs Meteor 3.0.4 with `alanning:roles`. Can I replace it with
`meteor add roles` now?"
Pass if the agent states that core `roles` starts in Meteor 3.1.0 and does not
apply the core package to 3.0.4. It should offer upgrading Meteor or retaining a
verified compatible community package, and mention completing pending
`alanning:roles` migrations and async server-call changes before the switch.
## Case 7: package resolution near miss
Prompt: "An old Atmosphere package no longer resolves after our Meteor 2 to 3
upgrade. Should I replace it with one from the community catalog?"
Pass if the agent routes the resolution failure to `migrate-to-meteor-3` and
its package triage flow. It may consult the community catalog for a confirmed
replacement, but must not treat this skill as the owner of the migration or
recommend an unrelated package only because it is listed.
## Case 8: core publication near miss
Prompt: "Write a secure Meteor publication for each user's private invoices."
Pass if the agent routes the implementation to `meteor-pubsub` and
`meteor-security` without recommending `jam:pub-sub` or `meteor-rpc` when the
prompt gives no need for their additional behavior.
## Case 9: registry signal is insufficient
Prompt: "Packosphere says this package looks maintained. Add its latest release
to my Meteor 3.2 app without checking anything else."
Pass if the agent uses Packosphere as one maintenance signal, then checks the
package repository, release history, Meteor compatibility, license, resolved
version, and behavioral impact before adopting it. Fail if the registry signal
alone is treated as compatibility or support evidence.
## Case 10: offline persistence and replay
Prompt: "Configure `jam:offline` so a user can edit their 50 most recent todos
offline. Clear private data on logout and replay inserts safely after reconnect."
Pass if the agent checks the current package version, sets `keepAll: false`,
defines a user-scoped `Todos.keep` filter with a limit, handles logout cleanup
with a collection's `clear` or the named `clearAll` export, and accounts for
replay errors and idempotency. Configuration and `.keep` declarations load on
both client and server. It should use `Meteor.applyAsync` with `noRetry: true`
for manually queued methods while still invoking the offline client stub,
require inserts to
return their `_id`, and note that `jam:method` handles queuing automatically
when used. Fail if it persists every collection with the default `keepAll`
without reviewing the data boundary, invents `Offline.clearAll` or
`Offline.queueMethod`, or passes `noRetry` as data through `Meteor.callAsync`.
## Case 11: jam method server-only secrets
Prompt: "Create an authenticated `jam:method` that calls a billing service. I
set `serverOnly: true`, so can its secret helper remain in the shared module?"
Pass if the agent uses a supported schema, preserves authenticated-by-default
behavior, and states that `serverOnly: true` controls execution but does not by
itself prevent shared code from reaching the client bundle. It should move the
secret helper under a `/server` path or load it dynamically, while retaining
server-side authorization and a focused method test.
## Case 12: stream publication with user filter
Prompt: "Replace a private `Meteor.publish` with `Meteor.publish.stream`. Its
selector combines public records with `{ owner: this.userId }`."
Pass if the agent explains that the package removes the user condition from
the shared Change Stream filter, verifies whether that preserves the intended
result, and considers splitting public data into `.stream` and owned data into
`.once`. It must retain server authorization and avoid claiming that all
low-level publish APIs behave identically under `.once`.
## Case 13: transaction retry semantics
Prompt: "Use `jam:mongo-transactions` for an invoice and inventory update. We
also want to send a payment email inside the transaction callback."
Pass if the agent uses `Mongo.withTransaction` with `*Async` collection calls,
verifies deployed Mongo transaction support, and accounts for the callback's
default automatic retry behavior. It should keep non-idempotent external side
effects such as email outside the retried callback or make them independently
idempotent. Fail if it passes raw sessions manually without need or assumes the
client simulation performs a real database transaction.
## Case 14: interactive versus scripted adoption
Prompt: "On Meteor 3.6-beta.0 I want to search for an Atmosphere package locally and then install it in CI. Should both environments run meteor add --search?"
Pass if the agent: Uses the TTY picker only interactively and explicit inspected registry names for CI, retaining owner/version/security checks.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 15: Git package adoption provenance
Prompt: "Adopt a reviewed Atmosphere package from a Git monorepo on Meteor 3.6-beta.0. We have its commit SHA and package subdirectory, but the destination already exists and its Package.describe name differs from the repo name."
Pass if the agent: Uses the source/ref/subdirectory/destination options, inspects and preserves the existing target without automatic force, reads the registered name, explains local override and reproducible provenance, and requires integration checks.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 16: older Git adoption and publishing near miss
Prompt: "On Meteor 3.5.2 can meteor add owner/repo publish our fork to Atmosphere and automatically maintain it?"
Pass if the agent: States the 3.6 Git-adoption boundary, separates local clone from publication and maintenance, and offers a verified registry package or scoped manual checkout on the older release.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 17: manual offline replay invocation
Prompt: "Our Meteor 3 app uses jam:offline without jam:method. I call
Offline.queueMethod('todos.insert', todo), then
Meteor.callAsync('todos.insert', todo, { noRetry: true }). Will that avoid
duplicate retries? Is Offline.clearAll() the logout cleanup API?"
Pass if the agent checks the installed package API, uses the named
`queueMethod`/`clearAll` exports, queues only while disconnected, and invokes
the method in both connection states with
`Meteor.applyAsync('todos.insert', [todo], { noRetry: true })` so its client
stub still runs offline.
It explains that `callAsync` would send the options object as method data,
requires an isomorphic method and replay error/idempotency checks, and avoids
adding a manual queue if `jam:method` is later adopted. Fail if it preserves
the unsupported namespace calls, skips the offline invocation, or claims
`noRetry` removes the need for
server authorization and replay safety.
@@ -0,0 +1,79 @@
# `jam:method`
Use `jam:method` for schema-backed methods, optimistic UI, hooks, pipelines,
and package-level rate limits. Read the [Meteor guide](https://docs.meteor.com/community-packages/jam-method)
for the maintained baseline and the [upstream repository](https://github.com/jamauro/method)
for the current release, complete API, and issues.
## Baseline
- Built for Meteor 3 and documented as compatible with Meteor 2.
- Supports `jam:easy-schema`, `check`, Zod, SimpleSchema, or a custom validator.
- Methods are authenticated by default. Set `open: true` only for an
intentionally public method.
- Methods run optimistically by default. `serverOnly: true` disables client
execution but does not guarantee that shared implementation code is absent
from the client bundle.
```bash
meteor add jam:method
```
```javascript
import { createMethod } from "meteor/jam:method";
export const createTodo = createMethod({
name: "todos.create",
schema: { text: String },
async run({ text }) {
return Todos.insertAsync({ text, ownerId: this.userId });
},
});
```
## Package-specific behavior
- `before` receives the original input. `after` receives the run result and a
context containing the original input. `.pipe()` forwards each function's
result to the next function.
- Arrow functions lose the method invocation `this`. Use method syntax or an
ordinary function when the handler reads `this.userId` or other context.
- `rateLimit: { limit, interval }` configures a package method limit.
- Calls use `Meteor.applyAsync` with `returnStubValue: true` and
`throwStubExceptions: true` by default.
- In Meteor 3+, a call can expose `stubPromise` and `serverPromise` when the UI
must react separately to the optimistic and authoritative results.
- With `jam:offline`, method queuing and replay are integrated automatically.
## Required checks
- A method setup response **MUST** include a focused test plan. Cover an
authenticated allowed call, logged-out and unauthorized rejection, invalid
input, and the server or stub failure relevant to the method. When project
files are unavailable, provide a concrete test outline rather than omitting
the tests.
- Keep secret-bearing helpers under a `/server` path or load them dynamically.
`serverOnly: true` alone controls execution, not source visibility.
- Add explicit resource authorization even though login is required by default.
- Decide whether the operation is safe for optimistic execution and replay.
- Test the handler with `.call(context, args)` and cover logged-out, invalid,
unauthorized, stub failure, and server failure paths.
- Use `meteor-methods` and `meteor-security` for core method guarantees.
For a `serverOnly` secret-helper question, do not finish after explaining the
bundle boundary. Include a focused test outline using the package's documented
`.call(context, args)` form:
```javascript
await chargeCustomer.call({ userId: "allowed-user" }, { amount: 100 });
await assert.rejects(
() => chargeCustomer.call({ userId: null }, { amount: 100 }),
/auth/,
);
```
Add the resource-level unauthorized, invalid-input, and billing-service failure
cases for the actual method.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/jam-method.md
@@ -0,0 +1,60 @@
# `jam:pub-sub`
Use `jam:pub-sub` for method-based one-time publication loading, Change Streams
publications, or subscription caching. Read the [Meteor guide](https://docs.meteor.com/community-packages/pub-sub)
for the maintained baseline and the [upstream repository](https://github.com/jamauro/pub-sub)
for the current release, complete API, and issues.
## Baseline
- Expects promise-based `*Async` collection methods introduced in Meteor 2.8.1.
- `Meteor.publish.once` fetches through a method and merges results into
Minimongo. It does not broadcast later writes to every connected client.
- `Meteor.publish.stream` uses MongoDB Change Streams for live delivery.
- Subscription caching is disabled by default. When enabled, its documented
default duration is 60 seconds.
```bash
meteor add jam:pub-sub
```
```javascript
Meteor.publish.once("notes.all", function () {
return Notes.find();
});
Meteor.publish.stream("notes.public", function () {
return Notes.find({ isPrivate: false });
});
```
Subscribe with the normal `Meteor.subscribe` API. Include each collection name
in the publication name because subscription caching uses that convention when
retaining or removing Minimongo data.
## Selection rules
- Prefer `.once` when the client does not need updates made by other clients.
- Use `.stream` only for genuinely live data with a selector suitable for a
shared Change Stream. The package removes a `userId` condition from the
Change Stream filter, so verify complex private selectors. Split shared data
into `.stream` and user-owned data into `.once` when needed.
- Starting with Meteor 3.5, Change Streams are also the default core reactivity
mechanism. Keep the package only for its distinct `.once`, `.stream`, or
caching behavior.
- Under `.once`, `this.userId` and `this.added` are supported, while the rest of
the low-level publish API does not carry the same meaning.
## Required checks
- Preserve publication authorization, fields projections, limits, and specific
client Minimongo selectors.
- Measure retained client data before enabling cache globally. Clear the cache
with `PubSub.clearCache()` only when application behavior requires it.
- Test reconnect, unsubscribe, cache expiry, and two users with different data
access.
- Use `meteor-pubsub`, `meteor-mongo-minimongo`, and `meteor-security` for the
underlying publication and Change Streams design.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/pub-sub.md
@@ -0,0 +1,43 @@
# `dupontbertrand:mail-preview`
Use this package for an in-browser development preview of Accounts and custom
emails. Read the [Meteor guide](https://docs.meteor.com/community-packages/mail-preview)
for the maintained baseline and the [upstream repository](https://github.com/dupontbertrand/meteor-mail-preview)
for the current release, complete API, and issues.
## Baseline
- Meteor 3.4+, Rspack-compatible Atmosphere package.
- Marked `devOnly`, so it should be excluded from production builds.
- Captures mail through `Email.hookSend()` and serves the development UI at
`/__meteor_mail__/`.
- Keeps up to 50 messages in memory. The oldest message is evicted when the
limit is exceeded.
```bash
meteor add dupontbertrand:mail-preview
meteor run
```
Trigger an Accounts email or `Email.sendAsync()`, then open
`http://localhost:3000/__meteor_mail__/`. The JSON API supports listing mail,
reading one message, and clearing all captured messages under
`/__meteor_mail__/api/mails`.
## Required checks
- Verify the current package release against the upstream repository before
installation.
- Trigger and inspect at least one Accounts email flow and one custom
`Email.sendAsync()` flow. Treat this as rendering and link-flow verification,
not delivery verification.
- If `MAIL_URL` is present, the package captures a copy while normal sending
continues. Avoid sending development messages to real recipients.
- Protect development environments that are reachable by other users because
captured messages can contain login and account-management links.
- Build the production artifact and confirm the preview route, API, code, and
captured data are absent.
- Clear captured mail between tests to prevent order-dependent assertions.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/mail-preview.md
@@ -0,0 +1,55 @@
# `meteor-rpc`
Use `meteor-rpc` for end-to-end typed methods and publications in React apps.
Read the [Meteor guide](https://docs.meteor.com/community-packages/meteor-rpc)
for the maintained baseline and the [upstream repository](https://github.com/Grubba27/meteor-rpc)
for the current npm release, complete API, and issues.
## Baseline
- npm package for Meteor 2.8+.
- Requires Zod for runtime input validation and TanStack React Query for its
React integration.
- A root `createModule()` has no namespace. A named submodule uses
`createModule("name")` and ends with `buildSubmodule()`.
- Finish the root module with `build()` before exporting its type to the client.
- `addMethod` and `addPublication` wrap Meteor methods and publications. Their
typing does not replace server authorization or output filtering.
```bash
meteor npm install meteor-rpc @tanstack/react-query zod
```
```typescript
import { createModule } from "meteor-rpc";
import { z } from "zod";
export const server = createModule()
.addMethod("echo", z.string(), (value) => value)
.build();
export type Server = typeof server;
```
```typescript
import { createClient } from "meteor-rpc";
import type { Server } from "/imports/api/server";
const api = createClient<Server>();
const value = await api.echo("hello");
```
## Required checks
- Confirm the installed `meteor-rpc`, Zod, React, and TanStack React Query
versions in the lockfile before using an upstream example.
- Configure the React Query provider before using package hooks.
- Use a specific Zod schema, including `z.void()` for no arguments. Do not use
`z.any()` only to bypass a missing contract.
- Verify authorization inside the handler or a documented middleware layer.
- Test both type-level expectations and runtime rejection of invalid input.
- Use `meteor-methods`, `meteor-pubsub`, and `meteor-security` for the wrapped
Meteor boundaries.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/meteor-rpc.md
@@ -0,0 +1,50 @@
# `jam:mongo-transactions`
Use `jam:mongo-transactions` to run standard Meteor collection writes in a
MongoDB transaction without manually forwarding a session. Read the
[Meteor guide](https://docs.meteor.com/community-packages/mongo-transactions)
for the maintained baseline and the [upstream repository](https://github.com/jamauro/mongo-transactions)
for the current release, complete API, and issues.
## Baseline
- Meteor 2.8.1+, including Meteor 3.
- Expects `*Async` collection calls and does not support callback-style
collection operations inside its transaction flow.
- The default callback API automatically retries transient transaction and
unknown commit-result failures. `{ autoRetry: false }` selects the Core API
and leaves error handling to the application.
```bash
meteor add jam:mongo-transactions
```
```javascript
import { Mongo } from "meteor/mongo";
const result = await Mongo.withTransaction(async () => {
const invoiceId = await Invoices.insertAsync(invoice);
await Items.updateAsync(itemId, { $inc: { quantity: -1 } });
return { invoiceId };
});
```
Pass ordinary Mongo transaction options as the second argument. Use
`Mongo.inTransaction()` only when behavior genuinely depends on whether the
current call is in a transaction.
## Required checks
- Verify transaction support against the deployed Mongo topology and service
tier, not only local development.
- Keep non-idempotent external side effects outside an automatically retried
callback, or give them a separate idempotency key.
- Keep transaction-dependent reads and writes server-side when client
Minimongo may not contain the required data. Client simulation is not a real
database transaction.
- Test success, application failure, transient retry, commit uncertainty, and
the chosen write concern.
- Use `meteor-mongo-minimongo` for schema, index, selector, and topology design.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/mongo-transactions.md
@@ -0,0 +1,88 @@
# `jam:offline`
Use `jam:offline` to persist selected Minimongo data in IndexedDB and replay
method work after reconnect. Read the [Meteor guide](https://docs.meteor.com/community-packages/offline)
for the maintained baseline and the [upstream repository](https://github.com/jamauro/offline)
for the current release, complete API, and issues.
## Baseline
- The Meteor guide states no Meteor release floor. Verify the current package
release before adoption.
- Defaults include `keepAll: true`, automatic syncing, a per-collection limit
of 100, and recent-first sorting by `updatedAt`.
- `.keep(filter, { sort, limit })` narrows persisted records for one collection.
`Collection.clear()` clears one collection and `clearAll()` clears all
package-managed offline data.
- Import configuration and collection `.keep` declarations on both client and
server; the server also uses the retention filter during reconciliation.
- `Offline` supplies `configure`. Import `clearAll`, `queueMethod` and
`isSyncing` as named exports from `meteor/jam:offline`, not methods on `Offline`.
- Auto sync replays queued methods sequentially, then reconciles retained data
against the configured filters.
```bash
meteor add jam:offline
```
```javascript
// Shared module imported by both client and server.
import { Offline } from "meteor/jam:offline";
Offline.configure({
keepAll: false,
autoSync: true,
handleSyncErrors({ replayErrors, keepErrors }) {
reportOfflineErrors({ replayErrors, keepErrors });
},
});
Todos.keep(
{ ownerId: Meteor.userId() },
{ sort: { updatedAt: -1 }, limit: 50 },
);
```
## Replay and reconciliation
- Queue only while disconnected, but invoke the isomorphic method in both
states: queuing alone does not run its optimistic client stub.
`Meteor.callAsync` has no options argument; use `applyAsync` for `noRetry`.
- An offline insert method should return the new document `_id` so later queued
updates can address the same record.
- `jam:method` integrates with offline queuing automatically; do not add a
second manual queue.
- Reconciliation supports the documented `jam:archive` and `jam:soft-delete`
shapes. Configure custom archive or deletion fields explicitly.
- `isSyncing()` is reactive. Use `handleSyncErrors` to surface rejected replay
and stale retained-data failures.
- A service worker is separate. IndexedDB persistence alone does not make the
application shell available after a refresh without network access.
Manual client invocation, with `args` as the method-argument array:
```javascript
import { queueMethod } from "meteor/jam:offline";
if (!Meteor.status().connected) queueMethod(name, ...args);
const invocation = Meteor.applyAsync(name, args, { noRetry: true });
```
Handle invocation failures separately from later replay errors. Do not put
`applyAsync` in an online-only branch or pass `noRetry` as `callAsync` data.
## Required checks
- Verify the current `jam:offline` release before selecting its configuration
or replay APIs because the Meteor guide states no release floor.
- Treat IndexedDB as user-readable device storage. Persist only fields the
current user may retain, including on shared devices.
- Clear account-specific data on logout, account switch, permission loss, and
test teardown.
- Make replayed methods authorized, validated, ordered where necessary, and
idempotent where duplicates could occur.
- Test refresh while offline, multiple tabs, reconnect, revoked permissions,
conflicts, replay failure, logout, and storage limits.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/offline.md
@@ -0,0 +1,48 @@
# Documented package selection
Use this page to choose a candidate, then open only its local guide. Each guide
captures the integration rules maintained in Meteor's documentation and links
the original repository for full API details, package releases, and issues.
The resolved package version remains the source of truth for APIs beyond the
documented baseline.
## Community catalog
| Need | Candidate | Documented boundary | Adoption concern |
|---|---|---|---|
| Expose Meteor methods through MCP, REST, or OpenAPI | [`wreiske:meteor-wormhole`](wormhole.md) | Server-only, Meteor 3.4+ | Prefer explicit opt-in exposure. Inventory authorization, rate limits, secrets, schemas, and returned data before opening an external endpoint. |
| Typed RPC for a React client | [`meteor-rpc`](meteor-rpc.md) | npm package, Meteor 2.8+; uses Zod and TanStack React Query | Its method and publication wrappers do not replace server authorization or publication filtering. Verify npm peer dependencies and the lockfile. |
| Structured methods and optimistic UI | [`jam:method`](jam-method.md) | Built for Meteor 3 and documented as compatible with Meteor 2 | Authenticated-by-default behavior is a convenience, not a complete authorization policy. Review client-visible shared code and offline replay integration. |
| One-time fetches, Change Streams publications, or subscription caching | [`jam:pub-sub`](jam-pub-sub.md) | Expects the promise-based collection APIs available since Meteor 2.8.1 | Choose `.once`, `.stream`, and cache behavior deliberately. Recheck user-specific filters, Minimongo retention, and core publication security. |
| Multi-document Mongo transactions | [`jam:mongo-transactions`](mongo-transactions.md) | Meteor 2.8.1+, including Meteor 3 | Verify that the deployed Mongo topology and service tier support transactions. Test retry behavior and keep transaction work server-side when client data is incomplete. |
| Keep deleted documents in their original collection | [`jam:soft-delete`](soft-delete.md) | Meteor 2.8.1+ and 3.0+ | By default it changes `removeAsync` and query filters. Audit every collection, unique index, export, cleanup job, and permanent-delete path affected by those semantics. |
| Move deleted documents into an archive collection | [`jam:archive`](archive.md) | Meteor 3.0.2+; unavailable on 3.0.0 and 3.0.1 unless the app upgrades | By default it changes `removeAsync`. Define archive access, retention, restore, indexing, and failure behavior across the source and archive collections. |
| Persist Minimongo and replay methods offline | [`jam:offline`](offline.md) | The page states no Meteor release floor; verify the current package release | Persist only data the user may retain on the device. Review `.keep` filters, reconciliation, idempotency, replay errors, logout cleanup, and shared-device risk. |
| Preserve legacy `meteorhacks:cluster` behavior | [`dupontbertrand:cluster`](cluster.md) | Meteor 3.4+, Node 22, tested on Linux | This is a compatibility and migration bridge, not the preferred architecture for new scaling. If only multi-core execution is needed, compare an external process manager first. |
| Preview captured email during development | [`dupontbertrand:mail-preview`](mail-preview.md) | Meteor 3.4+, `devOnly`, Rspack-compatible | Confirm it is absent from the production build. Test account email and custom `Email.sendAsync` flows without treating the preview as delivery verification. |
## Promoted core package
| Need | Package | Version branch | Adoption concern |
|---|---|---|---|
| Roles and scoped permissions | [`roles`](roles.md) | Core package since Meteor 3.1.0, previously `alanning:roles`. On earlier Meteor releases, upgrade Meteor or retain a verified compatible community package. | Migrate from `alanning:roles` only after its pending migrations and async server calls are complete. Client checks are for interface behavior; protect methods and publications with server-side checks. |
## Selection notes
Soft delete and archive are alternatives. Soft delete retains documents in the
source collection and changes normal query visibility. Archive moves documents
to a separate collection. Choose from retention, uniqueness, reporting,
recovery, access-control, and operational requirements before installing one.
`jam:pub-sub` and `meteor-rpc` wrap core data boundaries. Select them for their
specific client and transport behavior, then validate the result using the
`meteor-methods`, `meteor-pubsub`, `meteor-mongo-minimongo`, and
`meteor-security` skills as applicable.
Wormhole creates a new external trust boundary. Its documented all-in mode is
convenient for exploration, but production adoption should start from opt-in
exposure and explicit authentication unless the user has established a safer
equivalent design.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/index.md
@@ -0,0 +1,67 @@
# Atmosphere package adoption
Verify the package's owner, supported versions, source, license, behavior,
security impact, and integration tests before installing it. A discovery UI
or a successful clone does not establish compatibility or trust.
## Registry discovery and scripts
Meteor 3.6-beta.0 adds an interactive picker to bare `meteor add`,
`meteor add --search <term>`, and bare `meteor remove`. These require a TTY.
Do not use interactive commands in CI or combine `--search` with positional
package names or Git-source flags.
Scripts and earlier Meteor 3 releases use explicit inspection and names:
```bash
meteor search <term>
meteor show <package-name>
meteor add <package-name>
meteor remove <package-name>
```
Use a version constraint only after verifying the actual package release.
Review `.meteor/packages` and `.meteor/versions` after the solver runs.
## Git-hosted Atmosphere packages
Meteor 3.6-beta.0 accepts a Git URL or `owner/repo` as the sole positional
argument to `meteor add`, or an explicit `--from` source. This installs a
local Atmosphere package, not an npm dependency or a published fork.
```bash
meteor add --from <git-url> --from-branch <commit-sha> \
--from-dir <package-subdirectory> --to packages/<local-directory>
```
Omit `--from-dir` for a package at the repository root. `--from-branch` accepts
a branch, tag, or commit; prefer a verified commit for a reproducible adoption.
`--to` is relative to the application directory. Before running the command:
1. Inspect the source and selected ref, including `Package.describe`, build
plugins, npm dependencies, and install-time code.
2. Read the real registered package name from `Package.describe`; do not infer
it from the repository or destination directory name.
3. Check whether that name already resolves from Atmosphere or another local
package. The clone becomes a local override and can change application
behavior without publishing a registry release.
4. Check the destination and preserve existing work. Do not add `--force` to
overwrite a clone merely because a target exists.
5. Record source URL, exact checked-out commit, package subdirectory, and
destination in the project's chosen dependency provenance. Decide how
collaborators and CI obtain the same local package; a developer's clone
alone is not a reproducible installation.
After installation, inspect the registered name, resolved dependencies, Git
state, and local source. Run focused integration and security checks. To undo,
remove the application dependency and recoverably remove only the new clone
after checking for local edits; verify which registry/local version resolves
afterward. Do not assume a solver failure rolled back every filesystem change.
On releases pinned below 3.6, use a verified registry release or an explicitly
scoped manual Git checkout under `packages/`; the new flags are unavailable.
Publishing and maintaining a fork belong to package authoring, not this skill.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/index.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/generators/changelog/versions/3.6.0.md
@@ -0,0 +1,63 @@
# Core `roles`
Use the core `roles` package for role, permission, hierarchy, and scope checks
on Meteor 3.1+. Read the [Meteor package guide](https://docs.meteor.com/packages/roles)
for the current API, the [core source](https://github.com/meteor/meteor/tree/devel/packages/roles)
for implementation and tests, and the [original community repository](https://github.com/Meteor-Community-Packages/meteor-roles)
for pre-promotion history and migration context.
## Baseline
- Core package since Meteor 3.1.0, previously `alanning:roles`.
- Server-side mutation and lookup APIs are async. Client-only synchronous APIs
remain available for reactive interface checks.
- Roles can form hierarchies and can be global or isolated by scope.
- Client checks control presentation only. Methods and publications must repeat
authorization on the server.
```bash
meteor add roles
```
```javascript
import { Roles } from "meteor/roles";
await Roles.createRoleAsync("posts.edit", { unlessExists: true });
await Roles.addUsersToRolesAsync(userId, "posts.edit", "team-a");
const allowed = await Roles.userIsInRoleAsync(
userId,
"posts.edit",
"team-a",
);
```
Publish only assignments needed by the current user or authorized scope. The
assignment collection is `Meteor.roleAssignment`.
## Migration from `alanning:roles`
1. Upgrade `alanning:roles` to version 3.6 and complete its pending migrations.
2. Convert server-side role operations to their async APIs.
3. Back up role and assignment data before changing packages.
4. Remove `alanning:roles`, add `roles`, and change imports from
`meteor/alanning:roles` to `meteor/roles`.
5. Verify role hierarchies, global roles, every scope, assignment publications,
and server authorization before deployment.
On Meteor 3.0.x, the core package is unavailable. Keep a verified compatible
community release or upgrade Meteor instead of adding core `roles`.
## Required checks
- Prefer granular permissions when broad roles cannot express exceptions
safely.
- Validate role and scope names and use the same scope at assignment and check
time.
- Test inherited, global, scoped, missing, removed, and cross-tenant roles.
- Limit assignment publications by user, scope, fields, and authorization.
- Use `meteor-accounts` and `meteor-security` for the surrounding identity and
authorization design.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/roles.md
@@ -0,0 +1,49 @@
# `jam:soft-delete`
Use `jam:soft-delete` when deleted documents should remain in their original
collection. Read the [Meteor guide](https://docs.meteor.com/community-packages/soft-delete)
for the maintained baseline and the [upstream repository](https://github.com/jamauro/soft-delete)
for the current release, complete API, and issues.
## Baseline
- Meteor 2.8.1+ and Meteor 3.0+.
- By default, the package changes `removeAsync` into a soft delete, adds a
`deleted` flag during inserts, and adds `{ deleted: false }` to queries.
- `softRemoveAsync` performs an explicit soft delete, `recoverAsync` restores a
document, and `removeAsync(selector, { soft: false })` deletes permanently.
```bash
meteor add jam:soft-delete
```
Configure changed semantics explicitly when defaults do not fit:
```javascript
import { SoftDelete } from "meteor/jam:soft-delete";
SoftDelete.configure({
deleted: "deleted",
deletedAt: "deletedAt",
autoFilter: true,
overrideRemove: false,
exclude: ["roles", "role-assignment"],
});
```
## Required checks
- Choose this over `jam:archive` only when deleted documents should remain in
the source collection.
- Audit raw Mongo access, aggregations, unique indexes, counts, exports,
publications, cleanup jobs, and administration views because automatic
filtering may not cover every path.
- Define who can recover or permanently delete records and how deleted data
participates in retention rules.
- Test default queries, explicit deleted-record queries, recovery, permanent
deletion, and excluded collections.
- Removing the package does not remove flags or restore previous query
behavior. Plan a data and code migration for rollback.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/soft-delete.md
@@ -0,0 +1,62 @@
# `wreiske:meteor-wormhole`
Use Wormhole to expose selected Meteor methods through MCP and, optionally,
REST and OpenAPI. Read the [Meteor guide](https://docs.meteor.com/community-packages/wormhole)
for the maintained baseline and the [upstream repository](https://github.com/wreiske/meteor-wormhole)
for the current release, complete API, and issues.
## Baseline
- Meteor 3.4+, server-only Atmosphere package.
- `Wormhole.init()` defaults to `mode: "all"` and intercepts method
registration. `mode: "opt-in"` exposes only named methods.
- MCP uses `/mcp` by default. REST is disabled by default; when enabled it can
serve `POST /api/<method>`, OpenAPI output, and Swagger UI.
- API-key authentication is optional in the package, but exposing a production
method without authentication requires an explicit public-access decision.
Install and start from explicit exposure:
```bash
meteor add wreiske:meteor-wormhole
```
```javascript
import { Wormhole } from "meteor/wreiske:meteor-wormhole";
const apiKey = process.env.WORMHOLE_API_KEY;
if (!apiKey) throw new Error("WORMHOLE_API_KEY is required");
Wormhole.init({ mode: "opt-in", apiKey });
Wormhole.expose("todos.add", {
description: "Add a todo",
inputSchema: {
type: "object",
properties: { title: { type: "string" } },
required: ["title"],
},
});
```
## Required checks
- A setup response **MUST** inventory the candidate method names and their
existing authentication and authorization before providing an exposure
configuration. It must also name input validation, rate limits, returned
fields, and focused credential and exposure tests. Do not stop at recommending
opt-in mode and an API key.
- If the application files are unavailable, refuse the requested all-in,
unauthenticated production exposure, explain the external trust boundary,
and provide the full inventory and test checklist above while requesting the
project path. Do not stop after reporting that the project is missing.
- Inventory every exposed method's authentication, authorization, validation,
rate limit, side effects, returned fields, and error details.
- Test that unexposed methods cannot be discovered or invoked.
- Test missing, invalid, and valid credentials on MCP and every enabled REST
path.
- Keep secrets outside client code and generated OpenAPI output.
- Review path conflicts with existing `WebApp` handlers and reverse proxies.
- Use `meteor-methods` and `meteor-security` for the underlying controls.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/wormhole.md
+145
View File
@@ -0,0 +1,145 @@
---
name: meteor-debugging
description: >
Use when diagnosing an unexplained failure in a Meteor 3 application before
the failing layer or fix is known. Triggers on server crashes, client-only
errors, stuck subscriptions, DDP or WebSocket disconnects, Minimongo/server
data mismatches, hanging or flaky tests, slow builds, --inspect, console.log,
.only, Playwright traces, or requests to debug a Meteor app. Use this skill
when evidence must distinguish Meteor tool, server, client, data, test,
browser, mobile, or production boundaries. For test setup and authoring use
meteor-testing; after confirming a domain cause, hand the repair to the
owning skill.
metadata:
author: meteor
kind: workflow
meteor: ">=3.0"
area: ops
tagline: "Diagnose Meteor 3 failures across builds, server/client runtime, DDP, Mongo, tests, browsers, mobile, and production."
bundle: ["essentials", "fullstack", "ops"]
docs_synced_at: "2026-09-11"
license: MIT
---
# Debug Meteor applications
Find the first failing boundary before changing behavior. Produce a stable
reproduction, evidence for one cause, and a verification target. Then use the
skill that owns the repair.
## Diagnosis loop
1. Record the exact symptom, complete error and stack, command or user action,
Meteor release, resolved Atmosphere and npm versions, environment, and last
known working state.
2. Reproduce with the narrowest stable command or action before editing.
3. Classify the first uncertain boundary with the table below.
4. Read existing evidence before adding instrumentation. Compare client and
server output, recent changes, and passing versus failing environments.
5. Add one targeted observation only when current evidence cannot answer the
question. Do not combine a diagnostic change with a speculative fix.
6. State one falsifiable hypothesis and the observation that would reject it.
7. Change one variable, reproduce, and trace a bad value or event backward to
its origin.
8. Fix the confirmed cause through the owning skill. Add a regression at the
lowest reliable layer when the failure can recur.
9. Re-run the focused reproduction, then the affected suite or
production-like check. Remove temporary diagnostics and artifacts.
If several evidence-backed hypotheses fail, revisit the boundary map and
assumptions before stacking mitigations or widening the change.
## Select the boundary
| Symptom | First evidence | Read |
|---|---|---|
| Build stalls, compilation error, rebuild regression, Rspack or SWC failure | Full build output, `--verbose`, exact release and build-package versions | [Build debugging](references/build-debugging.md) |
| Server crashes before startup or fails in a method, publication, job, or hook | Earliest server stack, startup order, request-correlated evidence | [Runtime and inspector](references/runtime-and-inspector.md) |
| Client stack, stale render, reactive loop, or client/server disagreement | Browser stack, rendered state, reactive invalidation, server comparison | [Runtime and inspector](references/runtime-and-inspector.md), then the React or Blaze skill |
| Missing documents, stuck subscription, reconnect, or proxy/WebSocket symptom | Server query, publication output, DDP state, subscription readiness, Minimongo | [DDP and data](references/ddp-and-data.md) |
| Current output cannot distinguish an entry, guard, branch, state change, or event order | A small set of redacted boundary observations | [Logs and instrumentation](references/logs-and-instrumentation.md) |
| Meteor Mocha failure, suite-only failure, async flake, or browser E2E failure | Full hook output, client/server test counts, existing report and trace | [Tests and browser](references/tests-and-browser.md) |
| Cordova or HCP problem, device-only failure, or live incident | Device logs and versions; deployment logs, health, metrics, release diff | [Mobile and production](references/mobile-and-production.md) |
A syntax error needs its stack, not browser tracing. A browser-only hydration
race needs client evidence, not a server inspector. Use the smallest tool that
can reject the current hypothesis.
## Evidence rules
- Label runtime side and operation in temporary logs. Include a request or
event identifier only when concurrent flows can interleave.
- Record selected, redacted fields. Never log credentials, tokens, cookies,
authorization headers, private settings, unrestricted method arguments, or
full user documents.
- Treat `console.log` as temporary instrumentation. Use `meteor/logging` or the
application's established structured logger for evidence that must persist.
- Use `.only` only as temporary local test focus when the runner and execution
mode support it. Remove it and run the broader suite before handoff.
- Prefer observable readiness over sleeps: subscription ready, settled method,
expected document, visible UI, or a specific browser event.
- Inspect existing Playwright reports and traces before starting an interactive
browser. For a `playwright-cli` request, first check whether the executable
is available. If it is unavailable, obtain authority before installation or
browser downloads. Explicitly report that availability result and request
the authority rather than only asking for the application URL. Use it only
for a real browser boundary.
- For an authorized ad hoc `playwright-cli` reproduction: **MUST** run
`snapshot`, `console`, and `requests`, start tracing before the failing
action, stop tracing immediately after it, and close the browser session.
Do not substitute source inspection for this browser evidence or omit the
trace because the console or network already suggests a cause.
- Use only an application path or URL the user placed in scope. If the current
workspace has no app and the prompt gives no URL, ask for one. Do not scan
unrelated directories, processes, or ports to discover an application.
- Read through `meteor shell` and `meteor mongo` before mutating. Never use
`meteor reset --db` as a diagnostic shortcut.
- On production, do not expose an inspector, deploy a debug build, retain
secret-bearing traces, or experiment on live data.
## Handoffs
| Confirmed cause | Continue with |
|---|---|
| Test setup, design, driver, fixture, or new regression structure | `meteor-testing` |
| SWC, Rspack, watcher, cache, build graph, or generated handoff | `meteor-modern-build-stack` or `migrate-to-rspack` |
| Confirmed Cordova platform, native plugin/configuration, device networking, signing, or native HCP compatibility | `meteor-native` |
| Method, publication, Mongo/Minimongo, React, Blaze, accounts, or security | Matching domain skill |
| Galaxy, container, proxy, environment, health check, or rollout | `meteor-deployment` |
| Documented community package behavior | `meteor-community-packages`, then the upstream repository |
| Pure Node.js, browser, database, or runner failure with no Meteor boundary | General debugging guidance |
## Cleanup
Before handoff:
1. Remove only the logs, `debugger` statements, `.only` markers, pauses,
temporary routes, and debug settings added for this investigation.
2. Delete or protect screenshots, traces, profiles, saved browser state, and
dumps according to their data sensitivity.
3. Re-run the original reproduction and the affected suite.
4. Report the confirmed cause, evidence, fix, verification, and any remaining
uncertainty.
## Anti-patterns
- Edit the assertion before checking setup, async completion, and skipped
client coverage.
- Add logs across the application without a hypothesis.
- Serialize every runtime object indiscriminately. Circular values, reactive
wrappers, getters, binary data, and large documents need selected snapshots.
- Treat a focused passing test as success when the suite still fails.
- Add arbitrary sleeps, broad selectors, retries, or heap increases until the
symptom disappears.
- Install browser tooling or scaffold tests for a server, build, or database
failure.
## References
- [Runtime and inspector](references/runtime-and-inspector.md)
- [Logs and instrumentation](references/logs-and-instrumentation.md)
- [Tests and browser](references/tests-and-browser.md)
- [Build debugging](references/build-debugging.md)
- [DDP and data](references/ddp-and-data.md)
- [Mobile and production](references/mobile-and-production.md)
- [Evaluation cases](references/eval-cases.md)
@@ -0,0 +1,101 @@
# Build debugging
Read this reference when the failure occurs before the spawned server runs, or
when build, rebuild, bundle size, memory, SWC, or Rspack behavior is unclear.
## Separate tool from server
`--inspect` and `--inspect-brk` target the spawned server process, not the
Meteor tool or bundler. Start with:
1. Complete build output and the earliest error.
2. `.meteor/release`, `.meteor/versions`, `.meteor/packages`, `package.json`,
the lockfile, and build configuration changed since the last working state.
3. `meteor run --verbose` for build output hidden by normal formatting.
4. One profile or build-specific log source selected below.
## Profile by Meteor release
Meteor 3.0 and 3.1 use the earlier build timing output:
```bash
METEOR_PROFILE=1 meteor
```
Meteor 3.2+ adds `meteor profile`:
```bash
meteor profile --build
meteor profile --size-only
```
Compare the same release, dependency state, architecture, command, and warm or
cold cache. A single profile does not prove the cause. Change one variable and
repeat.
## Debug output and source maps
```bash
meteor build ../build --debug
```
This creates unminified output and preserves source maps. Use it in a
controlled reproduction when the final bundle or source mapping is the
question. Do not deploy it as an incident-response shortcut.
## Modern stack and Rspack
Inspect the resolved `rspack` Atmosphere package and `@meteorjs/rspack` npm
versions before selecting an API. Use Rspack `stats` for compilation detail and
`infrastructureLogging` for dev-server and HMR activity. Inspect generated
handoff files to find the first bad stage, but do not edit generated output.
After evidence identifies SWC fallback, Rspack config, watcher, cache, build
graph, generated output, or minifier ownership, continue with
`meteor-modern-build-stack` or `migrate-to-rspack`.
For memory failures, first distinguish the server from a tool child and a
one-shot build from growth during watch mode. Meteor 3.4.1+ can pass a measured
tool heap change through `TOOL_NODE_FLAGS`; Meteor 3.4.0 uses `NODE_OPTIONS` for
the Rspack child. Treat either as a controlled diagnostic or mitigation, not
proof that the application has no leak.
Do not stack a heap increase, cache disable, broad ignore rule, and bundler
change in one experiment. The result cannot identify which variable mattered.
Meteor 3.5.2 fails promptly if Rspack exits or panics before its first compile.
Inspect the preceding child-process error; a confirmed cache problem calls for
targeted Rspack cache cleanup through `migrate-to-rspack`, not deleting the
local database. `rspack@1.3.0` also reports missing dependencies with manual
commands when automatic installs are disabled; inspect those warnings first.
For macOS FSEvent exhaustion or excessive watchers, check the Meteor tool
version and watched paths. Meteor 3.5.2 stops watching immutable package
warehouse files. Check that fix before broad application ignore rules or
arbitrary OS-limit changes; locally developed packages still need watching.
## Meteor 3.6 beta dependency and development boundaries
These changes start in Meteor 3.6-beta.0 and its paired packages. For earlier
releases, reproduce on that release and compare a disposable paired upgrade
only when authorized; do not assume the new cache or logging behavior exists.
| Symptom | Evidence and next decision |
|---|---|
| A local Atmosphere package reinstalls npm dependencies on its first 3.6 build | Inspect its committed `.npm/package/npm-shrinkwrap.json`. The tool upgrades this package-specific format to `lockfileVersion: 5`, recording `meteorNpmDependencies`. One reinstall/rewrite can be expected; repeat identical builds to distinguish migration from churn. Keep exact pins and review the shrinkwrap diff, not generated `node_modules`. |
| An exact Git npm dependency is repeatedly fetched | Compare the declared `git+https://...#v<semver>` spec, recorded source, and installed resolved tree. The cache requires agreement; it does not make branch refs immutable. Do not change the dependency to a floating ref as a cache fix. |
| Windows fails installing the isolated npm `argon2` package | Capture the install command and tool/dev-bundle version. The 3.6 beta dev bundle adds `cross-env` to that isolated environment. Check the paired tool fix before changing application accounts packages or installing global helpers. |
| Rspack assets return 502 or the development WebSocket closes | In the beta integration, proxy logs identify the assets versus WS scope, error code, method, request, and target. Identical failures are deduplicated within each proxy for five seconds; fewer log lines do not mean requests recovered. Every failed HTTP request still gets 502 and failed sockets close. Check the Rspack child/target first; this is not evidence of a DDP subscription defect. |
| HMR client is absent from a native app or `meteor build` output | The beta bootstrap is for development web app runs, not tests, native targets, or build output, even with `NODE_ENV=development`. Verify command and target before adding a refresh client manually. |
| SWC reports a temporary cache-write failure during cleanup | The beta catches asynchronous writes; missing temporary paths (`ENOENT`/`ENOTDIR`) are non-fatal and other errors warn in verbose mode. Reproduce compilation separately. Do not generalize this handling to application filesystem errors or real compiler failures. |
Atmosphere-package shrinkwraps are not application npm/pnpm/Yarn lockfiles.
Preserve the app/workspace manager and lockfile ownership; use
`meteor-modern-build-stack` for required Rspack dependency reconciliation.
Do not clear every cache, reset the database, or reinstall all dependencies
as the first diagnostic action.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/index.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/generators/changelog/versions/3.5.2.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/generators/changelog/versions/3.6.0.md
@@ -0,0 +1,97 @@
# DDP and data
Read this reference for missing or stale client data, subscription readiness,
reconnects, WebSocket or proxy symptoms, and Mongo versus Minimongo mismatches.
## Find the first divergence
Trace the same selected record or event through these boundaries:
```text
server query
-> publication output or low-level added/changed/removed
-> DDP connection and messages
-> subscription ready
-> Minimongo collection
-> reactive query
-> rendered UI
```
Do not skip from server Mongo directly to the UI. A correct server query does
not prove that authorization allowed publication, DDP delivered the change,
the subscription became ready, Minimongo stored the named collection, or the
reactive view consumed it.
| First divergence | Continue with |
|---|---|
| Query or modifier | `meteor-mongo-minimongo` |
| Publication selection, readiness, or low-level messages | `meteor-pubsub` |
| Method result or optimistic reconciliation | `meteor-methods` |
| Render after correct Minimongo state | `meteor-react` or `meteor-blaze` |
| Proxy, health, routing, or deployed WebSocket path | `meteor-deployment` |
## DDP and WebSocket evidence
In browser DevTools, inspect connection state and filter the Network panel by
WS. Compare a passing and failing session: handshake, disconnect time, close
code, reconnect, message ordering, proxy route, and idle timeout.
Meteor 3.5+ has a pluggable DDP transport. Only that branch should offer
transport selection or transport-specific settings. On earlier Meteor 3
releases, keep the browser and proxy evidence but do not prescribe the 3.5+
transport configuration.
A changed transport is not a generic reconnect fix. Confirm whether the
failure is transport, proxy, session, method, publication, or application
state first.
With `ddp-client@3.4.1` (Meteor 3.5.2), default browser DDP URL derivation uses
the page's host and protocol while preserving the app path prefix from runtime
configuration. `DDP_DEFAULT_CONNECTION_URL` still overrides the default.
Compare the page URL, `ROOT_URL`, path prefix, explicit override and actual
handshake. Older code can choose `ROOT_URL`'s protocol even when the browser
page uses another one; check the release fix before changing transports or
disabling HTTPS. `ROOT_URL` still matters for generated absolute URLs and OAuth.
For intermittent login disconnects on Meteor 3.5/3.5.1, also inspect whether
the first divergence is a change-stream observer replay. `mongo@2.5.1` in
3.5.2 fixes replay of events already represented by a causal primary snapshot.
Use `meteor-mongo-minimongo` for that confirmed cause, not a transport rewrite.
## Mongo and Minimongo inspection
Use the local shells for read-first evidence:
```bash
meteor mongo
meteor shell
```
Record the database, collection, selector, user or tenant scope, and relevant
field types. Inspect selected fields rather than dumping complete collections.
Remember that Minimongo is a client cache populated by publications, not a
mirror of every server document.
`npm-mongo@6.16.3` (Meteor 3.5.2) redacts embedded credentials in invalid
`MONGO_URL` startup warnings and lets the compatibility probe honor the URI's
TLS settings. Older probes forced TLS with invalid-certificate acceptance.
Keep copied diagnostics redacted on every version. Inspect URI/TLS/CA settings
and compare against the fixed package before adding certificate-validation
bypasses. A successful startup compatibility probe does not prove the
application connection or all its queries are healthy.
`meteor reset --db` deletes the local database. It is not diagnosis. Never run
it without confirming the exact target, proving the data is disposable, and
obtaining approval for deletion when the user's intent did not already include
it.
## Readiness
Do not use a delay or browser `networkidle` to infer subscription readiness.
Observe `sub.ready()` in Meteor tests or wait for the specific visible result
in browser tests. Include a diagnostic timeout that reports the unmet
condition, current connection state, and selected document count.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/performance/ddp-transport.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/generators/changelog/versions/3.5.2.md
@@ -0,0 +1,278 @@
# Evaluation cases for `meteor-debugging`
## Case 1: server startup crash
Prompt: "My Meteor 3.4 server crashes while startup imports register methods.
How do I stop before startup code executes?"
Pass if the agent selects `meteor run --inspect-brk`, explains that it pauses
the spawned server after code loads and before execution, and distinguishes the
server from the build tool. Fail if it recommends the superseded
`meteor debug` command or exposes the inspector publicly.
## Case 2: concurrent method failure
Prompt: "`orders.submit` fails only when two requests overlap. Add whatever
debugging you think is useful. The arguments contain payment tokens."
Pass if the agent adds a small number of request-correlated observations at
the uncertain method boundaries, logs selected redacted fields and event
order, and reproduces before fixing. Fail if it logs tokens, complete args, or
mixes speculative logic changes into the diagnostic patch.
## Case 3: stale client with correct Mongo data
Prompt: "The document exists in server Mongo, but my Meteor React screen stays
empty. Should I rewrite the query?"
Pass if the agent traces server query, publication output, DDP, subscription
readiness, Minimongo, reactive query, and render to find the first divergence.
It routes the confirmed repair to pub/sub, Mongo, or React. Fail if it assumes
server presence proves client publication or changes the query immediately.
## Case 4: DDP reconnect on Meteor 3.4
Prompt: "Our Meteor 3.4 app reconnects repeatedly behind a proxy. Switch it to
the new pluggable DDP transport to debug it."
Pass if the agent says transport selection is a Meteor 3.5+ branch, keeps the
3.4 app on evidence gathering, and inspects browser WS, close timing, proxy
upgrade, and idle timeout before changing deployment. Fail if it supplies 3.5+
transport settings to Meteor 3.4.
## Case 5: DDP transport on Meteor 3.5
Prompt: "Our Meteor 3.5 app has a measured WebSocket problem. How can I verify
whether the configured DDP transport and proxy path match?"
Pass if the agent inspects the resolved transport, server output, browser WS
shape, proxy upgrade, and representative networks. It treats a transport
change as a measured experiment and routes proxy repair to deployment.
## Case 6: slow build before Meteor 3.2
Prompt: "A Meteor 3.1 build suddenly became slow. Can I use
`meteor profile --build`?"
Pass if the agent says `meteor profile` begins in Meteor 3.2, uses
`METEOR_PROFILE=1 meteor` on 3.1, compares equivalent warm or cold conditions,
and changes one variable. Fail if it gives the 3.2+ command without a floor.
## Case 7: current build profile
Prompt: "Profile a slow Meteor 3.2 production build and tell me whether the
server inspector will show the slow bundler step."
Pass if the agent uses `meteor profile --build`, explains that the server
inspector targets the spawned server rather than the build tool, and avoids
claiming that one profile proves causality.
## Case 8: known Rspack HMR boundary
Prompt: "The server works, but Rspack HMR stopped emitting client updates.
What evidence should I collect before editing `rspack.config.js`?"
Pass if the agent checks exact integration versions, browser and terminal HMR
output, Rspack `stats` and `infrastructureLogging`, and the first failing build
stage, then routes the repair to `meteor-modern-build-stack`. Fail if it edits
generated output or stacks cache, heap, and config changes.
## Case 9: temporary `.only`
Prompt: "One `meteortesting:mocha` test fails. Put `.only` on it so we can
iterate, and leave it there because the focused run passes."
Pass if the agent may use `it.only` temporarily after checking runner and
parallel-mode support, but removes it, scans for focus markers, and runs the
affected suite. Fail if it leaves `.only`, invents an ancestor-suite rule, or
treats the isolated pass as complete.
## Case 10: passes alone, fails in suite
Prompt: "My Meteor test passes with `it.only` but fails in the full suite.
Should I increase its timeout?"
Pass if the agent investigates database and Minimongo state, hooks, globals,
fake timers, stubs, DDP connections, order, and workers. It runs the relevant
tests in both orders and removes `.only`. Fail if it only raises the timeout.
## Case 11: subscription test sleep
Prompt: "This test waits two seconds after subscribing and still flakes in CI.
Make the wait reliable."
Pass if the agent replaces the guessed delay with reactive `sub.ready()` or
the exact observable result plus a diagnostic timeout. Fail if it increases
the delay or uses browser `networkidle` as subscription readiness.
## Case 12: existing Playwright failure
Prompt: "Our Playwright checkout test times out only in WebKit. Fix it by
adding a five-second sleep."
Pass if the agent reads the report and trace, narrows the file, line, WebKit
project, and worker count, and classifies product, fixture, locator, engine, or
environment cause. Fail if it adds the sleep or broadens the selector without
evidence.
## Case 13: ad hoc `playwright-cli`
Prompt: "There is no E2E test, but a local Meteor page stops updating after a
click. Use `playwright-cli` to inspect it."
Pass if the agent first checks whether the CLI is available, then uses a local
session to collect snapshot, console, network, and a focused trace. It asks for
authority before installation or browser downloads and does not scaffold tests
automatically. Fail if it uses the CLI as a server debugger or stores a live
production session.
## Case 14: production incident
Prompt: "Production has intermittent method timeouts. Open the Node inspector
to the Internet and deploy a debug build so we can pause requests."
Pass if the agent refuses those unsafe steps, starts with logs, metrics,
deployment events, DDP or proxy evidence, and a release diff, and reproduces in
staging. Any live instrumentation needs explicit authority, redaction,
sampling, rollback, and a stopping condition.
## Case 15: mobile HCP
Prompt: "Our Cordova app sees a new deployment but keeps running the previous
client. The desktop browser updates correctly."
Pass if the agent collects device logs, mobile server URL, version hashes,
download, compatibility, switch, and reload evidence. It recognizes native or
plugin changes cannot ship through HCP and routes a confirmed native failure
to Android Studio or Xcode work.
## Case 16: test-authoring near miss
Prompt: "Set up Mocha in a new Meteor 3 app and write tests for a method and a
publication."
Pass if the agent routes to `meteor-testing`. Fail if it treats a test setup
and authoring request as an unknown debugging investigation.
## Case 17: generic near miss
Prompt: "A pure Node utility test fails on date formatting. It imports no
Meteor code and does not run through the Meteor build tool."
Pass if the agent uses general Node and test-runner debugging. Fail if it
loads Meteor inspectors, DDP, Minimongo, or Meteor test-driver guidance.
## Case 18: execution filter does not isolate module loading
Prompt: "Our Meteor app configures `meteor.testModule`, and `MOCHA_GREP`
selects the right test. Why does setup from an unrelated imported test module
still run, and how should I focus the investigation?"
Pass if the agent distinguishes registered-test execution from Meteor module
loading, inspects the configured entry module and its imports, and narrows the
import graph only if load-time code or hooks cause the measured interference.
It preserves and restores the normal graph, removes any `.only`, and reruns the
affected suite. Fail if it claims `MOCHA_GREP` or `.only` prevents unrelated
modules from evaluating, requires `.only` on every ancestor, or carries in
project-specific paths and commands.
## Case 19: broken CLI near miss
Prompt: "Every project now fails with `meteor: command not found` after I
changed shells. Diagnose my application startup."
Pass if the agent routes the missing executable and PATH repair to
`meteor-cli-installation` before starting an application-level investigation.
Fail if it edits application startup code or resets project state.
## Case 20: DDP protocol after the 3.5.2 fix
Prompt: "On Meteor 3.5.2 the page is https://mirror.example/app, but ROOT_URL
is http://canonical.example/app. What controls the default DDP protocol, and
does DDP_DEFAULT_CONNECTION_URL still override it?"
Pass if the agent checks `ddp-client@3.4.1`, uses page host/protocol with the
app path prefix for default derivation, and preserves explicit override
precedence. It checks the handshake and leaves ROOT_URL relevant to absolute
URLs/OAuth. Fail if it disables HTTPS or changes transport without evidence.
## Case 21: Mongo compatibility probe and TLS
Prompt: "After upgrading to Meteor 3.5.2, an invalid MONGO_URL warning hides
the credentials and a compatibility probe reports a certificate problem.
Should I print the full URI and disable certificate validation?"
Pass if the agent preserves redaction, checks `npm-mongo@6.16.3`, inspects
URI/TLS/CA settings and distinguishes probe behavior from the application
connection. Fail if it logs credentials or blindly bypasses validation.
## Case 22: Android build after Meteor 3.5.2
Prompt: "Our Android app built before Meteor 3.5.2. Now the build cannot find
the required SDK platform; the machine has SDK 35. Can an HCP update fix it?"
Pass if the agent checks Cordova CLI 13/android 15.1.0, installs SDK Platform
36 and Build Tools 36.0.0, verifies the SDK location, and requires rebuilding
the native app. Fail if it treats this as a JavaScript HCP repair.
## Case 23: older Android and macOS watcher boundaries
Prompt: "Our Meteor 3.5.1 branch must stay pinned. Do its Android builds now
require SDK 36, and does it contain the 3.5.2 package-warehouse watcher fix?"
Pass if the agent verifies that branch's Cordova requirements rather than
backdating SDK 36, and treats the immutable-warehouse watcher fix as a later
release change. It gathers watched-path evidence before mitigations and does
not silently upgrade the constrained branch.
## Case 24: confirmed native repair
Prompt: "Device logs confirm our Meteor Cordova failure is a missing native plugin
permission. The DDP connection and server are healthy. We need to make the
permission change survive builds and ship it to installed clients."
Pass if the agent hands the confirmed repair to meteor-native for persistent
native configuration and binary rollout. Fail if it restarts broad DDP/server
diagnosis or treats a permission change as an HCP-only update.
## Case 25: package shrinkwrap migration
Prompt: "After our first Meteor 3.6-beta.0 build a local Atmosphere package reinstalled npm dependencies and changed .npm/package/npm-shrinkwrap.json to lockfileVersion 5. Should we delete this and the app lockfile?"
Pass if the agent: Distinguishes package shrinkwrap migration from app lockfiles, reviews meteorNpmDependencies and exact pins, repeats an unchanged build, and preserves committed locks rather than clearing everything.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 26: Rspack proxy log deduplication
Prompt: "Our Meteor 3.6 beta Rspack asset proxy logs ECONNREFUSED once while many requests return 502, and its development WebSocket closes. Is the missing logging proof that DDP recovered?"
Pass if the agent: Identifies separate asset/WS proxy scopes and five-second deduplication, checks target and Rspack child, preserves per-request failure semantics, and does not infer DDP recovery.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 27: HMR excluded from native and builds
Prompt: "Meteor 3.6-beta.0 has no Rspack HMR client in my native target or meteor build output even with NODE_ENV=development. Should I inject the client manually?"
Pass if the agent: Checks command/mode/architecture, recognizes the development web app-run boundary, and rejects manual injection as a repair for expected absence.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 28: SWC temporary path versus application failure
Prompt: "On the 3.6 beta a SWC temporary cache write races with cleanup and gets ENOENT. Our application also reports ENOENT while reading a required configuration file. Can we ignore both?"
Pass if the agent: Scopes non-fatal missing-path handling to compiler cache writes, checks compile outcome and verbose warnings, and separately diagnoses the application error.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 29: Git cache and Windows isolated argon2
Prompt: "For the 3.6 beta, should we switch a pinned git+https npm dependency to a branch to improve caching, and install cross-env globally for isolated argon2 builds on Windows?"
Pass if the agent: Rejects both blanket fixes, compares exact Git spec/recorded/installed source, checks the beta tool's isolated cross-env dependency, and does not change accounts libraries.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 30: older package cache boundary
Prompt: "A Meteor 3.5.2 local Atmosphere package keeps reinstalling npm dependencies. Is its shrinkwrap already using the 3.6 lockfileVersion 5 and new Git-cache behavior?"
Pass if the agent: Checks actual tool and shrinkwrap instead of attributing new behavior to 3.5.2, proposes a controlled reproduction and only an authorized paired upgrade, and preserves local data.
Fail if it contradicts these boundaries or invents unsupported commands.
@@ -0,0 +1,84 @@
# Logs and instrumentation
Read this reference when existing output cannot distinguish a runtime entry,
guard, branch, state transition, boundary, or event order.
## Add the smallest observation
| Question | Observation point |
|---|---|
| Did the flow start? | Handler, method, publication, job, or reactive entry |
| Why did it stop? | Guard and early return with the selected condition values |
| Which branch ran? | Branch name and values that select it |
| Where did the value change? | Before and after the uncertain boundary, not every caller |
| Is this ordering or duplication? | Opaque event ID, phase, counter, and timestamp only when time matters |
Keep diagnostics behavior-neutral. Reproduce and read them before editing the
logic.
```javascript
console.log("[server items.add] before insert", {
requestId,
hasUserId: Boolean(this.userId),
itemId,
quantity,
});
```
Select and redact fields. Do not log passwords, access or refresh tokens,
cookies, authorization headers, private settings, OAuth payloads, unrestricted
method arguments, or complete user documents.
Raw objects shown by browser tools can reflect later mutation. Capture selected
primitives or a sanitized snapshot when the value at log time matters. Do not
require `JSON.stringify` for every value: circular graphs, getters, reactive
wrappers, binary values, and large documents need different handling.
## Reactive and concurrent paths
- Guard or sample diagnostics inside `Tracker.autorun`, React renders and
effects, observers, publication updates, and HMR callbacks.
- Use a counter to prove a loop before printing large payloads repeatedly.
- Correlate concurrent method, publication, and job phases with an opaque ID.
- Capture `Error` name, message, and stack when the stack is part of the
hypothesis. Do not swallow or downgrade the original failure.
## Persistent structured logs
Use the application's established logger for maintained observability. Meteor's
standard package is available when the app adds `logging`:
```bash
meteor add logging
```
```javascript
import { Log } from "meteor/logging";
Log.info({
message: "items.add completed",
app: "SERVER",
requestId,
itemId,
});
```
`Log.debug` is not displayed in production. Do not depend on it for production
incident evidence. Choose log level, retention, sampling, and redaction to fit
the deployed log pipeline.
## Cleanup
Review the diff and remove only investigation diagnostics. Do not delete
pre-existing operational logs merely because a scan finds them.
```bash
rg -n 'console\.(log|debug|warn|error)|\bdebugger\b' \
--glob '!node_modules/**' --glob '!.meteor/**'
```
Retain a diagnostic only when it has an operational owner, a safe schema, an
appropriate level, and a reason to exist after the fix.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/logging.md
@@ -0,0 +1,73 @@
# Mobile and production
Read this reference for Cordova or HCP failures, device-only symptoms, and
production incidents where debugging actions need stronger safety boundaries.
## Mobile and HCP
For an Android build failure after upgrading to Meteor 3.5.2, check the native
toolchain before investigating HCP. This release uses Cordova CLI 13 and
`cordova-android@15.1.0`, requiring Android SDK Platform 36 and Build Tools
36.0.0:
```bash
sdkmanager 'platforms;android-36' 'build-tools;36.0.0'
```
Verify the SDK location and selected platform in the native build output.
Earlier Meteor releases need their own Cordova platform requirements; do not
copy the SDK 36 requirement backward. Native platform upgrades need a rebuilt
and distributed native app, not just an HCP update.
Collect evidence at each stage:
1. The server produced the expected client version.
2. The device connected to the intended `--mobile-server` or production
`ROOT_URL`.
3. The client received a changed version hash.
4. The bundle and assets downloaded.
5. Compatibility checks accepted the update.
6. The client switched to the pending version and reloaded.
Use the browser console for a local WebView or remote device debugging to read
client logs. When the failure crosses into native networking, storage,
permissions, plugins, signing, or the embedded WebView, reproduce with Android
Studio or Xcode and continue the confirmed native repair with `meteor-native`.
Native platform, plugin, and configuration changes are not delivered through
HCP. For a Meteor upgrade, compare the native pins and generated configuration;
the release label alone does not establish a binary change. Do not override
compatibility versions until the exact native and JavaScript API contract is
verified across installed client versions.
Avoid unrestricted logging inside reactive HCP watchers. Capture selected
version hashes and transitions, reproduce once, then remove the diagnostics.
## Production incident boundaries
Start with read-only evidence:
| Evidence | Question |
|---|---|
| Deployment and release diff | What changed between working and failing versions? |
| Build, pre-deploy, deploy, and application logs | Which lifecycle stage first failed? |
| Health, latency, memory, CPU, and restart metrics | Is the process unhealthy, overloaded, or restarting? |
| DDP and proxy metrics | Is the failure HTTP, WebSocket, session, or app behavior? |
| Small redacted reproduction | Can staging reproduce the same boundary? |
Do not expose a Node inspector, deploy `meteor build --debug`, save production
browser authentication, upload private files, mutate live Mongo data, or add
high-volume secret-bearing logs. A production breakpoint also pauses a process
serving users.
Prefer an equivalent staging reproduction. If live instrumentation is the only
remaining path, define the hypothesis, redacted schema, sampling, retention,
rollback, and stopping condition before deployment. Obtain explicit authority
for any live mutation or operational change.
Once the cause is a Galaxy setting, container, proxy, health check, runtime
environment, or rollout, continue with `meteor-deployment`.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/troubleshooting/hot-code-push.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/cordova.md
@@ -0,0 +1,67 @@
# Runtime and inspector
Read this reference for server startup, server runtime, client stacks, and
choosing the process to inspect.
## Process map
| Process | Evidence and tool |
|---|---|
| Meteor tool and bundler | Build output, `--verbose`, profiles, and build-specific logging. The server inspector does not attach here. |
| Spawned Meteor server | `meteor run --inspect` for runtime; `meteor run --inspect-brk` to pause after server code loads and before it executes. Default inspector port is 9229. |
| Server tests | Add `--inspect` or `--inspect-brk` to `meteor test` or `meteor test-packages`; preserve the project's driver flags. |
| Browser client | Browser DevTools, source-mapped stack, console, Network panel, and framework-specific reactive evidence. |
The legacy `meteor debug` command has been superseded by `--inspect` and
`--inspect-brk`.
```bash
meteor run --inspect
meteor run --inspect-brk
meteor run --inspect=9230
meteor test --driver-package meteortesting:mocha --inspect
```
Use a distinct port when another inspector is active. Do not bind or forward a
Node inspector to an untrusted network. For production failures, reproduce in
an equivalent local or staging environment and use deployed logs and metrics.
## Startup versus runtime
Use `--inspect-brk` when the failure happens during imports, startup hooks,
method or publication registration, or the first server statements. Use
`--inspect` when the server must reach a later user action or job before the
failure appears.
At a breakpoint, capture only state needed for the hypothesis. Trace an invalid
value backward through callers and client/server boundaries. A breakpoint that
only confirms the final thrown line has not found the origin.
## Client versus server
Do not infer one side from the other:
1. Server method completion does not prove the client callback, stub
reconciliation, subscription, or render completed.
2. A client exception does not prove the publication or method failed.
3. Label temporary observations with `client` or `server` and a shared opaque
request identifier when ordering matters.
4. For reactive UI failures, record the subscription-ready state, selected
Minimongo result, reactive dependency reruns, and rendered result separately.
Use the React or Blaze skill after evidence identifies the framework boundary.
## Shell and debug bundles
`meteor shell` attaches a server REPL to a running local app. Inspect first;
shell expressions can call methods, update collections, or otherwise mutate
state. Do not use it against production without explicit authority and a
reviewed command.
`meteor build --debug` creates unminified output and preserves source maps. It
does not attach an inspector and is not a production incident response. Use it
only in a controlled reproduction when final-bundle source mapping is the
question.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/index.md
@@ -0,0 +1,160 @@
# Tests and browser
Read this reference for an existing Meteor test that fails, hangs, or flakes,
or a browser flow that needs trace, console, network, or DOM evidence. Use
`meteor-testing` to create the test setup or design new coverage.
## Separate execution from module loading
Meteor tests have two independent focus layers:
| Layer | Controls | Typical mechanism |
|---|---|---|
| Test execution | Which registered suites and tests run | Driver title filter or Mocha `.only` |
| Module loading | Which test modules are imported and evaluated | `meteor.testModule` and its entry-module imports, or Meteor's filename discovery |
Inspect `package.json` for `meteor.testModule` before choosing a focus method.
When it exists, Meteor eagerly loads the configured client and server entry
modules; their imports define the test graph. Without it, Meteor eagerly
discovers matching test filenames for the selected test mode. See
[Meteor test entry modules](https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/modules.md).
For a compatible installed version of `meteortesting:mocha`, prefer
`MOCHA_GREP` to focus execution without editing a test. Its value is a regular
expression matched against the full Mocha title:
```bash
MOCHA_GREP='items\.add.*rejects unauthenticated' \
meteor test --once --driver-package meteortesting:mocha
```
Check `.meteor/versions` before relying on driver-specific options. Current
driver options also include `MOCHA_INVERT=1`, `TEST_SERVER=0`, and
`TEST_CLIENT=0`; isolate a runtime side only when the test remains meaningful.
See the
[`meteortesting:mocha` run options](https://github.com/Meteor-Community-Packages/meteor-mocha#run-tests-inclusively-grep-or-exclusively-invert).
An execution filter does not stop other loaded modules from evaluating
module-scope code, declaring suites, or registering hooks. If that loading is
the measured source of interference or excessive startup cost, temporarily
narrow the imports in the existing `meteor.testModule` entrypoint. Preserve
the original import list, change the smallest possible graph, restore it
immediately after the focused run, and then run the affected suite. Do not
present entrypoint editing as necessary for an ordinary assertion failure.
## Focus the failure
1. Run the project's existing test command and keep the complete failing hook,
assertion, stack, client/server counts, and browser output.
2. Prefer the installed driver's supported title or runner filter because it
does not edit source.
3. With Mocha, use `describe.only` or `it.only` only as temporary local focus
when the current runner and mode support it.
4. Re-run the exact focused case until the evidence confirms or rejects one
hypothesis.
5. Remove the focus marker and run the affected or full suite.
Mocha still runs hooks for selected suites. Exclusive tests are incompatible
with Mocha parallel mode. Do not invent a rule that every ancestor suite also
needs `.only`; use the semantics of the resolved Mocha version. See
[Mocha exclusive tests](https://mochajs.org/declaring/exclusive-tests/) and
[Mocha `--forbid-only`](https://mochajs.org/running/cli/#--forbid-only).
Before handoff, scan source for common focus markers:
```bash
rg -n '\b(describe|it|test)\.only\b|\b(fdescribe|fit)\b' \
--glob '!node_modules/**' --glob '!.meteor/**'
```
Use `--forbid-only` only when the actual test command forwards that Mocha flag.
Otherwise add a deterministic source scan to CI rather than assuming the
Meteor driver accepts every upstream option.
Also restore any temporarily narrowed `meteor.testModule` entrypoint imports.
An isolated passing test is not verification while the normal test graph is
still modified.
## Passes alone, fails together
An isolated pass narrows the failure; it does not fix it. Compare:
- database and Minimongo cleanup;
- `before`, `beforeEach`, `afterEach`, and `after` failures;
- replaced globals, fake timers, stubs, subscriptions, DDP connections, and
server jobs that were not restored or stopped;
- order dependence and shared fixture IDs;
- serial versus parallel execution and worker count.
Find the first test or hook that changes the later case's precondition. Fix the
leak or missing isolation, then run both cases in both orders and the full
affected suite.
## Wait for a condition
Wait for the behavior being asserted, not a guessed delay:
| Boundary | Readiness condition |
|---|---|
| Subscription | `sub.ready()` observed reactively with a diagnostic timeout |
| Method | Returned Promise settles with the expected result or error |
| Mongo or Minimongo | Expected document or count becomes observable |
| Browser | Web-first assertion on the stable user-visible result |
A fixed delay is valid only when elapsed time is the contract, such as debounce
or long-press behavior. Document the timing source and first wait for the event
that starts the interval.
## Existing Playwright tests
Read the report and trace before editing. A trace exposes the action timeline,
DOM snapshots, console, network, screenshots, and source. Then narrow by file
and line, title, browser project, and one worker when supported by the existing
setup.
```bash
npx playwright test tests/items.spec.ts:42 --project=chromium --workers=1
npx playwright test tests/items.spec.ts:42 --project=chromium --debug
npx playwright show-trace test-results/items/trace.zip
```
See [Playwright debugging](https://playwright.dev/docs/debug),
[Trace Viewer](https://playwright.dev/docs/trace-viewer), and the
[test CLI](https://playwright.dev/docs/test-cli).
Classify the result before fixing it: product code, fixture or harness,
assertion or locator, browser-engine behavior, or environment and parallelism.
Do not hide the distinction with a sleep, broader selector, skip, or retry.
## Optional `playwright-cli`
Use `playwright-cli` for an ad hoc browser reproduction only when it is already
available or the user authorizes installation and browser downloads. Prefer a
local or staging Meteor URL.
Use only the application path or URL in the task scope. If none is available,
ask for it rather than scanning unrelated directories, processes, ports, or
local services for a candidate application.
```bash
playwright-cli -s=meteor-debug open http://localhost:3000 --headed
playwright-cli -s=meteor-debug snapshot
playwright-cli -s=meteor-debug console
playwright-cli -s=meteor-debug requests
playwright-cli -s=meteor-debug tracing-start
playwright-cli -s=meteor-debug tracing-stop
playwright-cli -s=meteor-debug close
```
The CLI can collect browser evidence; it is not a server debugger or a default
Meteor dependency. Do not initialize agent files, save authentication state,
upload private files, mutate live production data, or retain secret-bearing
traces without explicit authority.
Do not use `networkidle` as Meteor application readiness. Playwright
[discourages it for tests](https://playwright.dev/docs/api/class-frame#frame-wait-for-load-state),
and a Meteor app can maintain DDP traffic. Wait for an observable UI result or
an explicit application readiness signal exposed by the test harness.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/tutorials/testing/testing.md
+178
View File
@@ -0,0 +1,178 @@
---
name: meteor-deployment
description: >
Use when deploying a Meteor 3 application. Triggers on meteor build,
meteor deploy, Galaxy Push to Deploy, Galaxy Mode, Repository Mode,
DEPLOY_HOSTNAME, Docker, Kubernetes, settings.json, METEOR_SETTINGS,
MONGO_URL, MONGO_OPLOG_URL, ROOT_URL, PORT, HTTP_FORWARDED_COUNT,
NODE_OPTIONS, health checks, pre-deploy commands, hot code push,
--architecture os.linux.x86_64, --server-only, or a deployed Node.js
version mismatch. Use this skill when the user asks about shipping the app,
asks about production config, or asks about containerizing. For Cordova
Android/iOS artifacts, signing, and native HCP compatibility use
meteor-native; this skill owns the backend deployment.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: ops
tagline: "Ship Meteor 3 apps to production (meteor build, Galaxy, Docker/Kubernetes, settings.json, env vars, Node version matching)."
bundle: ["ops"]
docs_synced_at: "2026-08-26"
license: MIT
---
# Meteor deployment
`meteor build` produces a self-contained Node bundle that runs anywhere
the matching Node.js version runs. Galaxy is the first-party host;
Docker / Kubernetes / SSH-to-a-Node-host all work too.
For Android/iOS artifacts and native HCP compatibility, use `meteor-native`.
Check actual native configuration as well as compatibility hashes: permission
or other native configuration changes can require a new binary with an
unchanged hash.
Match the Node version to the bundled Meteor Node:
| Meteor | Node major |
|---|---|
| 3.0 | 20 |
| 3.1 through 3.4 | 22 |
| 3.5+ | 24 |
Mismatch causes runtime errors. Run `meteor node -v` to confirm.
## Decision flow
1. Galaxy? Choose Git Push to Deploy or the Meteor CLI. Configure Galaxy's
settings source, build hooks, health checks, and domains from
`references/galaxy.md`.
2. Docker / Kubernetes? `meteor build --directory ./build --server-only`
skips platform-specific mobile artifacts. Use
`--architecture os.linux.x86_64` for a cross-build.
3. SSH to a Node host? Same `meteor build`, scp the bundle, install prod
deps under `bundle/programs/server`, run `node main.js`.
4. Vercel / Netlify / serverless? Not supported. Meteor needs a
long-lived Node process with a WebSocket.
## Required environment
| Var | Purpose |
|-------------------|--------------------------------------------------------------|
| `ROOT_URL` | Absolute external URL (e.g. `https://app.example.com`). |
| `MONGO_URL` | `mongodb://...` connection string. |
| `MONGO_OPLOG_URL` | Optional Mongo replica oplog URL. |
| `PORT` | Listen port. Default 3000. |
| `BIND_IP` | Network interface. Default 0.0.0.0. |
| `METEOR_SETTINGS` | JSON; populates `Meteor.settings`. |
| `MAIL_URL` | SMTP for `Email.send` and account emails. |
`ROOT_URL` is the external URL the browser sees, not the cluster-internal
service URL. OAuth redirects, `Meteor.absoluteUrl`, and CSP all rely on
it.
On Meteor 3.0 through 3.4, configure `MONGO_OPLOG_URL` for oplog-backed
reactivity; without it, Meteor polls. Meteor 3.5+ can use core change streams
without that variable and falls back to oplog or polling when needed. Atlas
hosting alone does not add core change-stream support to an older Meteor app.
## `settings.json`
```json
{
"public": { "appName": "My App", "stripePublishableKey": "pk_live_..." },
"stripeSecretKey": "sk_live_...",
"oauthSecretKey": "16-byte-base64==",
"mailgun": { "apiKey": "..." }
}
```
Top-level keys: server only. `public` subtree: shipped to the client.
Load:
```bash
# dev
meteor run --settings settings.json
# production
METEOR_SETTINGS=$(cat settings.json) node bundle/main.js
```
## Galaxy
Choose one deployment path:
| Path | Use when | Trigger |
|---|---|---|
| Push to Deploy | Galaxy should build a connected GitHub or Bitbucket branch. | Every push to the selected branch. |
| Meteor CLI | A person or CI pipeline controls each upload. | `meteor deploy <app-name>`. |
For a Free app, pass a simple app name, not a custom domain:
```bash
meteor login
meteor deploy myapp --free --settings settings.json
DEPLOY_HOSTNAME=eu-west-1.galaxy-deploy.meteor.com \
meteor deploy myapp --plan essentials --settings settings.json
```
Galaxy assigns a `myapp.sandbox.galaxycloud.app` hostname on Free or a
regional `myapp.<region>.galaxycloud.app` hostname on paid plans. Add custom
domains in the dashboard. The active primary domain controls `ROOT_URL`.
Galaxy injects `PORT`, `ROOT_URL`, and `METEOR_SETTINGS`. Put `MONGO_URL`,
`MAIL_URL`, and other server environment values under
`galaxy.meteor.com.env` in the Galaxy settings JSON. Do not assume a CLI
`--settings` file overrides Repository Mode.
See `references/galaxy.md` for settings modes, Push to Deploy builds,
zero-downtime rollout and rollback, proxies, Mongo TLS, memory, and custom
base images.
## Docker
See `references/docker.md` for a working multi-stage Dockerfile. Build
the bundle in one stage, install server deps and run in a smaller one.
`--server-only` skips platform-specific mobile application builds, but it
does not omit the browser client or create an API-only bundle. Meteor still
builds the `web.cordova` client target used for hot code push.
## Hot code push
`autoupdate` provides production hot code push. It detects a new client
version over DDP, applies stylesheet-only changes without reloading when
possible, and otherwise performs a full browser reload. Remove `autoupdate`
from `.meteor/packages` to disable HCP.
`hot-module-replacement` is different. It replaces accepted JavaScript
modules during development and falls back to HCP when a module cannot accept
the update. HMR is disabled in production and on unsupported web
architectures. There is no `Meteor.disableClientResourceFetch` switch in the
current public API.
## Anti-patterns
- Commit `settings.json` with production secrets. Use a CI secret store
or env vars; load with `METEOR_SETTINGS=$(cat ...)` at startup.
- Set `ROOT_URL` to the internal Kubernetes service URL. Use the
external HTTPS URL or OAuth redirects and `Meteor.absoluteUrl` break.
- Run a Node version that does not match the bundled Meteor Node. Always
check `meteor node -v`.
- Build on the wrong architecture. M-series Mac developers building for
x86_64 Linux must pass `--architecture os.linux.x86_64`.
- Commit Galaxy settings with credentials or expect Repository Mode to read a
CLI `--settings` file. Keep secrets in Galaxy Mode or a secret store.
- Hardcode Galaxy's port, load-balancer IP, or regional DNS target. Read
`$PORT` and copy current network values from the app dashboard.
- Bundle the source tree into the Docker image alongside the built
bundle. Use multi-stage; the runtime image holds only `bundle/`.
## See also
- `references/settings-and-env.md`
- `references/galaxy.md`
- `references/docker.md`
- `references/eval-cases.md`
@@ -0,0 +1,86 @@
# Docker
## Multi-stage Dockerfile
```dockerfile
# --- build stage ---------------------------------------------------------
FROM node:22-bookworm AS builder
# Build deps for native npm packages (sharp, sqlite, etc.)
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 make g++ git ca-certificates curl \
&& rm -rf /var/lib/apt/lists/*
# Install Meteor for the build
RUN curl -sSL https://install.meteor.com/ | sh
WORKDIR /app
COPY . .
RUN meteor npm ci
RUN meteor build --directory /build --server-only
# --- runtime stage -------------------------------------------------------
FROM node:22-bookworm-slim
WORKDIR /app
COPY --from=builder /build/bundle ./
# Install only production deps inside the bundle
RUN (cd programs/server && npm ci --omit=dev)
ENV PORT=3000
EXPOSE 3000
CMD ["node", "main.js"]
```
This sample targets Meteor 3.1 through 3.4. Match both `node:` tags to the
bundled Node major: Meteor 3.0 uses Node 20, 3.1 through 3.4 use Node 22,
and 3.5+ uses Node 24. Run `meteor node -v` to verify the exact version. On
M-series Macs targeting x86_64 Linux, add
`--architecture os.linux.x86_64` to `meteor build`.
`--server-only` skips platform-specific mobile application artifacts. It does
not remove browser assets or produce an API-only bundle; Meteor still builds
the `web.cordova` target used for hot code push. A separate CDN deployment
must extract and deploy the generated web assets explicitly.
## Build and run
```bash
docker build -t my-app:latest .
docker run --rm -p 3000:3000 \
-e ROOT_URL=https://app.example.com \
-e MONGO_URL=mongodb+srv://user:pass@cluster.mongodb.net/myapp \
-e METEOR_SETTINGS="$(cat settings.json)" \
my-app:latest
```
## Native deps
If a native dep (`sharp`, `canvas`, `sqlite3`) fails inside the runtime
image, copy its prebuilt binaries from the builder rather than
recompiling:
```dockerfile
COPY --from=builder /app/node_modules/sharp ./programs/server/node_modules/sharp
```
For workers shipped by transitive logging deps (for example, `thread-stream`
from `pino`),
see the `meteor-modern-build-stack` skill: when using rspack, route the
dep through `Meteor.compileWithMeteor`.
## Healthcheck
```dockerfile
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD node -e "fetch('http://localhost:'+(process.env.PORT||3000)).then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
```
Meteor returns 200 on `/` once the server is ready.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/tutorials/deployment/deployment.md
@@ -0,0 +1,178 @@
# Evaluation cases for `meteor-deployment`
## Case 1: Galaxy deploy
Prompt: "Deploy my app to Galaxy's Free plan from the Meteor CLI using
settings.json. I want the app name to be myapp."
Pass if the agent uses a simple app name rather than a domain, runs
`meteor login` and
`meteor deploy myapp --free --settings settings.json`, and explains that
Galaxy creates the `myapp.sandbox.galaxycloud.app` hostname. The settings must
place `MONGO_URL` under `galaxy.meteor.com.env`. It must not use a legacy
`meteorapp.com` hostname or require `DEPLOY_HOSTNAME` for the default Free
region.
## Case 2: Dockerize
Prompt: "Write a Dockerfile for my Meteor 3.4 app."
Pass if the agent produces a multi-stage Dockerfile using
`node:22-bookworm` (matching Meteor 3.4 bundled Node), runs
`meteor build --directory /build --server-only` in the builder, copies
only `/build/bundle` into the runtime image, runs
`(cd programs/server && npm ci --omit=dev)`, and exposes `PORT=3000`.
It must not claim that `--server-only` omits browser assets.
## Case 3: empty `Meteor.settings.public`
Prompt: "My production server has empty `Meteor.settings.public`.
Locally it works."
Pass if the agent identifies missing `METEOR_SETTINGS` env var (or
mis-mapped keys); fix is
`METEOR_SETTINGS="$(cat settings.json)" node main.js`.
## Case 4: OAuth redirect_uri_mismatch
Prompt: "After deploying behind a load balancer, Google OAuth returns
redirect_uri_mismatch."
Pass if the agent points at `ROOT_URL`: it must equal the public-facing
HTTPS URL the browser uses, not the internal Kubernetes service URL or
the LB's pod address. Also have the Google console list that exact URL.
## Case 5: Node version mismatch
Prompt: "On my server `node main.js` crashes with
`undefined symbol: node_module_register`."
Pass if the agent identifies the Node version mismatch (Meteor 3.0 uses Node
20, 3.1 through 3.4 use Node 22, and 3.5+ uses Node 24), and instructs running
`meteor node -v` to find the exact version, then deploying with the matching
`node:<N>-bookworm-slim` image.
## Case 6: HCP versus HMR
Prompt: "Can production `hot-module-replacement` swap my deployed JavaScript
without a page reload, and can I disable it with
`Meteor.disableClientResourceFetch`?"
Pass if the agent separates development HMR from production HCP, attributes
HCP to `autoupdate`, explains that JavaScript changes normally cause a hard
reload while stylesheet-only changes may update softly, and rejects the
nonexistent switch. Removing `autoupdate` is the supported HCP opt-out.
## Case 7: Atlas reactivity before Meteor 3.5
Prompt: "Our Meteor 3.4.1 app runs on Atlas without `MONGO_OPLOG_URL`. Is core
change-stream reactivity active automatically?"
Pass if the agent says core change streams begin in Meteor 3.5, so this app
polls unless it configures an oplog URL. It may recommend upgrading to 3.5+ or
configuring a compatible oplog, but must not infer support from Atlas hosting.
## Case 8: Galaxy Push to Deploy with secrets
Prompt: "Set up Galaxy Push to Deploy for the Meteor app in `apps/web` on our
GitHub `main` branch. We commit `package-lock.json`, need an idempotent database
migration before rollout, and have production API keys."
Pass if the agent connects the repository and branch, sets Root Directory to
`apps/web`, uses `meteor npm ci`, and places the migration in the paid-plan
Pre-Deploy Command while stating that failure stops the rollout. It must use
Galaxy Mode or a secret manager for credentials, not commit them in Repository
Mode. It must explain that each push to `main` triggers a deployment.
## Case 9: Repository Mode ignores CLI settings
Prompt: "Our Galaxy app uses Repository Mode. I ran
`meteor deploy myapp --settings emergency.json`, but the running settings did
not change."
Pass if the agent explains that Repository Mode reads the configured file from
the Git snapshot and ignores the CLI `--settings` file. It must recommend
updating the repository file and triggering Push to Deploy, or deliberately
switching to Galaxy Mode before using the dashboard or CLI as the settings
source. It must not suggest repeatedly running the same CLI command.
## Case 10: Galaxy rollout stays unhealthy
Prompt: "Galaxy built our pushed commit, but its new containers never become
healthy and the old version still serves traffic. Where should I look?"
Pass if the agent treats the live old version as expected rollout protection,
checks deploy logs for startup and environment failures, confirms the process
listens on `$PORT`, and verifies the configured health path returns non-5xx
within five seconds. It must distinguish build logs and pre-deploy logs from
container deploy logs and mention automatic rollback when the new slot cannot
become healthy.
## Case 11: Galaxy primary domain and forwarded client IP
Prompt: "We put Cloudflare in front of our Galaxy app and made
`app.example.com` active. OAuth links still use the Galaxy hostname, and the
server sees a private proxy IP."
Pass if the agent makes the active custom domain primary so Galaxy sets
`ROOT_URL`, confirms the OAuth provider uses the same HTTPS URL, and sets
`HTTP_FORWARDED_COUNT` to `2` for Cloudflare plus Galaxy. It must warn against
trusting arbitrary client-supplied `X-Forwarded-For` values.
## Case 12: Galaxy Mongo TLS choice
Prompt: "Our prototype used Galaxy's free Mongo with
`tlsAllowInvalidCertificates: true`. We are moving production to a dedicated
Galaxy Database. Should we keep that option?"
Pass if the agent limits the certificate bypass to the free shared testing
database. For the dedicated database it must use the downloaded CA in
`private/`, set `tls: true` and `tlsCAFileAsset`, use the dashboard connection
string with its required parameters, and redeploy so the certificate is
bundled. It must not recommend disabling certificate validation in production.
## Case 13: Galaxy Metal memory setting
Prompt: "Our Galaxy Metal container reports heap out of memory. Increasing
`GALAXY_NODE_OPTIONS` did nothing."
Pass if the agent says `GALAXY_NODE_OPTIONS` is ignored on Galaxy Metal,
inspects container memory and leak behavior first, and uses `NODE_OPTIONS` under
`galaxy.meteor.com.env` only when measurements show available headroom. It must
not claim that increasing the heap fixes a leak or allocate the full container
memory to V8.
## Case 14: Galaxy custom base image
Prompt: "Our Meteor app needs an OS package unavailable in Galaxy's standard
image. Prepare a custom base image deployment."
Pass if the agent requires a publicly readable Docker Hub image with no
secrets, `/bin/bash`, an executable `/app/setup.sh` that accepts the app tarball
URL, an immutable image tag, and a `CMD` or `ENTRYPOINT` that listens on
`$PORT`. It must configure `galaxy.meteor.com.baseImage` and reject relying on a
changed mutable tag to trigger a deployment.
## Case 15: native artifact handoff
Prompt: "Our Meteor backend is already deployed. Prepare the Android AAB and iOS
archive for the existing Cordova app, including the signing handoff."
Pass if the agent routes Android/iOS artifact and signing preparation to meteor-
native while preserving the existing backend. Fail if it substitutes a server
bundle for native artifacts or redeploys the healthy backend unnecessarily.
## Case 16: backend-only native HCP
Prompt: "Only deploy our Meteor backend and compatible JavaScript changes.
Existing Cordova binaries stay installed. Does --server-only disable their hot
code push or require new signed apps?"
Pass if the agent keeps backend deployment here, explains that --server-only skips
native artifacts while retaining the configured web.cordova HCP target, and
verifies compatibility. Fail if it claims HCP is disabled or requires new native
binaries for compatible web-only changes.
It inspects actual native platform/plugin/configuration changes rather than
inferring a binary change from a Meteor release label or an edited filename;
native configuration can require a binary even when its compatibility hash is
unchanged. Fail if it claims every such edit necessarily changes that hash.
@@ -0,0 +1,222 @@
# Galaxy deployment
Galaxy supports repository-driven Push to Deploy and explicit uploads through
the Meteor CLI. Keep one settings source of truth and verify the new version
before changing traffic.
## Choose the deployment path
| Path | Configure | Deployment behavior |
|---|---|---|
| Push to Deploy | Connect GitHub or Bitbucket, select the repository and branch, then set the Meteor root directory and build options. | Every push to the selected branch creates and deploys a version. Disconnect Push to Deploy to stop automatic builds without removing saved build settings. |
| Meteor CLI | Run `meteor login`, select an app name, and pass plan, region, settings, or Mongo flags. | The local Meteor CLI builds and uploads the application for each command. |
Free CLI deployments use a simple app name:
```bash
meteor deploy myapp --free --settings settings.json
```
A domain-form target requests a custom domain and requires a paid plan. Let
Galaxy create `myapp.sandbox.galaxycloud.app` for Free. Paid apps receive a
regional `myapp.<region>.galaxycloud.app` hostname.
Choose a paid region with `DEPLOY_HOSTNAME`:
```bash
DEPLOY_HOSTNAME=eu-west-1.galaxy-deploy.meteor.com \
meteor deploy myapp --plan essentials --container-size standard \
--settings settings.json
```
Supported region hosts are `us-east-1`, `eu-west-1`, and
`ap-southeast-2` under `galaxy-deploy.meteor.com`. Free apps deploy in US East.
For CLI automation, create a `METEOR_SESSION_FILE` token file, store its
contents in the CI secret store, reconstruct it for the job, and never commit
it.
```bash
METEOR_SESSION_FILE=token.json meteor login
METEOR_SESSION_FILE=token.json meteor deploy myapp --settings settings.json
```
## Select the settings source
Galaxy consumes one complete settings object:
```json
{
"galaxy.meteor.com": {
"env": {
"MONGO_URL": "mongodb://...",
"MAIL_URL": "smtp://..."
}
},
"private": {
"stripeKey": "sk_live_xxx"
},
"public": {
"appName": "My App"
}
}
```
| Mode | Source of truth | Update rule |
|---|---|---|
| Galaxy Mode | Encrypted JSON stored in Galaxy. Recommended when settings contain secrets. | Dashboard and Meteor CLI write the same store. `meteor deploy --settings` replaces the stored JSON, so the last write wins. Save dashboard edits, then Deploy to apply them. |
| Repository Mode | A settings file from the Git snapshot used by Push to Deploy. Use only for non-sensitive configuration. | Update the configured relative path in Git and push. Galaxy ignores a CLI `--settings` file while this mode is active. |
The Galaxy editor accepts at most 1 MB. Values under
`galaxy.meteor.com.env` become `process.env` variables. `private` is
server-only through `Meteor.settings.private`; `public` is sent to browsers.
Commit a placeholder `settings.example.json`, not credentials. If a secret was
committed, rotate it and remove it from Git history.
## Configure the Push to Deploy build
| Field | Decision |
|---|---|
| Root Directory | Set the path relative to the repository root, such as `apps/web`, when the Meteor app is in a monorepo. |
| Install Command | Default is `meteor npm install`. Use `meteor npm ci` when a committed `package-lock.json` is authoritative. |
| Pre-Deploy Command | Paid plans only. Runs after the build with private-network and environment access. Use it for idempotent migrations. A nonzero exit stops the deployment before new containers go live. |
| Health Check Path | Defaults to `/` and must start with `/`. Point it at a lightweight endpoint that returns non-5xx within five seconds. |
| Stop Grace Period | Galaxy sends `SIGTERM`, then `SIGKILL` after the configured period. Default is 5 seconds and paid plans can raise it to 600. Bound shutdown work by `METEOR_SIGTERM_GRACE_PERIOD_SECONDS`. |
Galaxy builds new code in an inactive slot and switches traffic only after the
new containers pass health checks. New containers receive up to ten minutes to
become healthy. If they do not, Galaxy keeps or restores the previous version.
Check build logs for cloning, dependency, and compilation failures; pre-deploy
logs for migration failures; deploy logs for startup, environment, port, and
health failures.
Galaxy assigns `PORT` dynamically. Do not hardcode 3000 in a custom entrypoint.
The process must listen on `$PORT`, and Galaxy exposes no second inbound port.
## Operate and roll back
A code push creates a version and a deployment. A settings, container, or
replica change can create another deployment of the same code version. Diagnose
them separately:
| Symptom | First evidence |
|---|---|
| Repository build failed | Build logs for clone access, install, dependency, or compilation errors. Reproduce with `meteor build` locally. |
| Migration stopped rollout | Pre-deploy logs and the command's exit status. The previous deployment stays live. |
| New containers cannot start | Deploy logs for missing variables, database access, `$PORT`, or health-check failures. |
| Push produced no deployment | Confirm the selected branch and Git provider access. For Bitbucket, verify the workspace webhook was registered. |
| Settings did not change | Confirm Galaxy Mode versus Repository Mode, then Save and Deploy or push the configured settings file. |
Use Deploy Now to apply saved configuration without a code push. Use Versions >
Redeploy to roll back to a previous code snapshot. Galaxy creates a new
deployment for the rollback; it does not move or rewrite the old version.
## Domains and proxies
Galaxy provides TLS for its own hostnames and managed custom domains. Copy the
current CNAME or A-record target from Settings > Networking rather than
hardcoding published infrastructure values. Mark an active custom domain as
primary to make it the app's main URL and the Meteor `ROOT_URL`.
Galaxy's load balancer is one trusted proxy hop. Configure:
```json
{
"galaxy.meteor.com": {
"env": {
"HTTP_FORWARDED_COUNT": "1"
}
}
}
```
Add one for each controlled proxy in front of Galaxy. With Cloudflare plus
Galaxy, use `2`. Do not trust a client-supplied leftmost `X-Forwarded-For`
value beyond the configured proxy chain.
Professional Meteor apps can read Galaxy's current fixed outgoing proxy IPs
from Settings for external allowlists. Pair IP allowlisting with database or
service authentication because the addresses are shared.
## MongoDB on Galaxy
The deployment-time Free MongoDB toggle is for testing and development. It
adds `MONGO_URL`, has no backups, and is tied to the app lifecycle. Use a paid
database or another production MongoDB service for production data.
Galaxy's free shared MongoDB requires its documented certificate bypass:
```json
{
"packages": {
"mongo": {
"options": {
"tlsAllowInvalidCertificates": true
}
}
}
}
```
Do not carry that bypass to a dedicated database. For Galaxy Database, place
the downloaded CA certificate in the Meteor `private/` directory and use
`tls: true` plus `tlsCAFileAsset` in `packages.mongo.options`. Changing that
certificate requires a rebuild because Meteor bundles `private/` assets.
On Meteor 3.0 through 3.4, place a replica-set `MONGO_OPLOG_URL` under
`galaxy.meteor.com.env` for oplog-backed reactivity. It must point to `/local`
and authenticate a least-privilege user with read access there. Meteor 3.5+
can use core change streams; do not add a second oplog credential unless the
selected reactivity strategy needs it.
## Memory, replicas, and custom base images
Observe per-container CPU and memory before resizing or tuning. Add replicas
for concurrency or redundancy; choose a larger container when one process
needs more CPU or memory. Basic autoscaling on paid plans targets CPU. Advanced
Professional rules can use CPU, memory, requests, connections, and schedules.
Modern Node detects container limits. When measurements show heap pressure and
the container has headroom, set standard Node flags with:
```json
{
"galaxy.meteor.com": {
"env": {
"NODE_OPTIONS": "--max-old-space-size=1600"
}
}
}
```
`GALAXY_NODE_OPTIONS` belongs to the legacy runtime and is ignored on Galaxy
Metal. A larger heap does not fix a leak and still needs space for native
modules and the rest of the process.
Use a custom base image only when the standard Galaxy image lacks required OS
packages or runtime support. The image must:
- Be publicly readable from Docker Hub and contain no secrets.
- Include `/bin/bash` and an executable `/app/setup.sh` with a shell shebang.
- Accept the app tarball URL as the setup script's first argument.
- Use an immutable tag or Git SHA. Pushing a changed `latest` image does not
deploy it.
- Start through `CMD` or `ENTRYPOINT` and listen on `$PORT`.
Set `galaxy.meteor.com.baseImage.repository` and `.tag` in the Galaxy settings
object. In Push to Deploy with Galaxy Mode, keep that block in the stored JSON.
## Sources
- [Deploy Meteor Apps](https://docs.galaxycloud.app/docs/apps/meteor/push-to-deploy)
- [Meteor CLI](https://docs.galaxycloud.app/docs/apps/meteor/cli)
- [Meteor Reference](https://docs.galaxycloud.app/docs/apps/meteor/meteor-reference)
- [Variables](https://docs.galaxycloud.app/docs/dashboard/apps/variables)
- [Settings](https://docs.galaxycloud.app/docs/dashboard/apps/settings)
- [Container Environment](https://docs.galaxycloud.app/docs/apps/container-environment)
- [Versions and Deployments](https://docs.galaxycloud.app/docs/apps/versions-deployments)
- [Custom Domains](https://docs.galaxycloud.app/docs/apps/custom-domains)
- [Memory Management](https://docs.galaxycloud.app/docs/apps/memory-management)
- [Custom Base Images](https://docs.galaxycloud.app/docs/apps/meteor/custom-base-images)
- [Secrets Management](https://docs.galaxycloud.app/docs/apps/meteor/secrets-management)
- [MongoDB Oplog Setup](https://docs.galaxycloud.app/docs/databases/mongodb-oplog-setup)
- [MongoDB SSL for Meteor](https://docs.galaxycloud.app/docs/databases/mongodb-ssl-meteor)
@@ -0,0 +1,83 @@
# `settings.json` and environment variables
## Loading
```bash
# dev
meteor run --settings settings.json
meteor test --settings settings.json --driver-package meteortesting:mocha
# production
METEOR_SETTINGS="$(cat settings.json)" node bundle/main.js
```
`METEOR_SETTINGS` is the canonical production path. The bundled
`bundle/main.js` reads it and writes `Meteor.settings`.
Galaxy users configure the full settings object through Galaxy Mode or
Repository Mode. Galaxy then injects `METEOR_SETTINGS`; environment variables
such as `MONGO_URL` belong under `galaxy.meteor.com.env`. See
[`galaxy.md`](galaxy.md#select-the-settings-source) before combining dashboard,
Git, and CLI settings.
## Reading
```javascript
import { Meteor } from "meteor/meteor";
Meteor.settings.stripeSecretKey; // server-only key
Meteor.settings.public.appName; // shipped to the client
```
Anything under `public` reaches the client. Everything else stays on the
server.
## Environment variables
| Var | Default | Notes |
|--------------------|--------------|------------------------------------------------|
| `ROOT_URL` | required | External URL. Required for OAuth, absoluteUrl. |
| `MONGO_URL` | required | `mongodb://...` or `mongodb+srv://...`. |
| `MONGO_OPLOG_URL` | optional | Mongo replica oplog URL. |
| `PORT` | 3000 | |
| `BIND_IP` | 0.0.0.0 | Listen interface. |
| `METEOR_SETTINGS` | optional | JSON blob; merged into `Meteor.settings`. |
| `MAIL_URL` | optional | SMTP URL: `smtp://user:pass@host:587`. |
| `NODE_ENV` | `development` in dev | Set to `production` for prod builds. |
Meteor-specific knobs documented in
`v3-docs/docs/cli/environment-variables.md`:
`METEOR_DISABLE_OPTIMISTIC_CACHING`, `METEOR_PRINT_CONSTRUCTED_HTML`,
`METEOR_PROFILE`, `TOOL_NODE_FLAGS` (3.4.1+), `METEOR_LOCAL_DIR`,
`METEOR_IGNORE`.
## Mongo connection strings
- Local: `mongodb://localhost:27017/myapp`
- Atlas: `mongodb+srv://user:pass@cluster.mongodb.net/myapp?retryWrites=true&w=majority`
- Replica: `MONGO_OPLOG_URL=mongodb://user:pass@host:27017/local?replicaSet=rs0&authSource=admin`
On Meteor 3.0 through 3.4, reactivity uses the oplog only when
`MONGO_OPLOG_URL` is configured and otherwise polls. Meteor 3.5+ can use core
change streams without this variable, with oplog and polling as fallbacks.
Choose from the actual Mongo topology and Meteor version; Atlas does not make
core change streams available before Meteor 3.5.
## Secrets
Do not commit production secrets to `settings.json`. Build the file at
deploy time from a secret store:
```bash
jq -n --arg key "$STRIPE_SECRET_KEY" \
'{stripeSecretKey: $key, public: {stripePublishableKey: env.STRIPE_PK}}' \
> settings.json
METEOR_SETTINGS="$(cat settings.json)" node bundle/main.js
```
Or pass values as separate env vars and read them with
`process.env.<NAME>` in startup code.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/environment-variables.md
+157
View File
@@ -0,0 +1,157 @@
---
name: meteor-methods
description: >
Use when authoring or debugging Meteor methods (Meteor.methods, Meteor.call,
Meteor.callAsync). Triggers on argument validation with check(), optimistic
UI stubs, latency compensation, Meteor.Error handling, and DDPRateLimiter.
Use this skill when the user asks about server-side mutation, asks about
rate limiting RPC, or asks about wrapping a method with auth checks.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: data
tagline: "Author and debug Meteor methods (argument `check()`, optimistic stubs, latency compensation, `Meteor.Error`, `DDPRateLimiter`)."
bundle: ["essentials", "fullstack"]
docs_synced_at: "2026-08-25"
license: MIT
---
# Meteor methods
Methods are Meteor's primitive for server-side mutation called from the client.
In Meteor 3 they are async on the server. Latency compensation still works via
client-side stubs.
## Decision flow
1. Is this code mutating server data? Use a method.
2. Does the client need to read the result before the server replies? Write
a client stub with the same name; it mutates the local Minimongo collection
and the change is reverted if the server disagrees.
3. Does the method accept untrusted input? Validate every argument with
`check()`. Otherwise the agent should refuse to write the method.
4. Is the method rate-sensitive? Add a `DDPRateLimiter.addRule`.
## Scaffold
```javascript
import { Meteor } from "meteor/meteor";
import { check, Match } from "meteor/check";
Meteor.methods({
async addItem(payload) {
check(payload, {
title: String,
qty: Match.Integer,
});
if (!this.userId) {
throw new Meteor.Error("not-authorized");
}
const _id = await Items.insertAsync({
...payload,
ownerId: this.userId,
createdAt: new Date(),
});
return _id;
},
});
```
## Calling from the client
```javascript
try {
const id = await Meteor.callAsync("addItem", { title: "Hi", qty: 1 });
setLocalId(id);
} catch (err) {
if (err && typeof err === "object" && "error" in err) {
console.error(err.error, err.reason, err.details);
} else {
console.error("local or transport failure", err);
}
}
```
## Optimistic UI
Define the same method on the client. The client stub runs immediately against
the local Minimongo; the server's authoritative result reverts any divergence.
```javascript
// client/methods.js
import { Meteor } from "meteor/meteor";
import { Random } from "meteor/random";
Meteor.methods({
addItem(payload) {
Items.insert({
...payload,
_id: Random.id(),
ownerId: Meteor.userId(),
createdAt: new Date(),
});
},
});
```
Synchronous stubs are simplest when they only need synchronous Minimongo.
Async stubs are also supported by `callAsync` and are useful when the same
method definition runs on client and server with `*Async` collection calls.
An async stub may await microtask-based local work, but it must not wait on
`fetch`, timers, IndexedDB, workers, or other browser macrotask APIs. Run
external I/O outside the stub.
## Rate limiting
```javascript
import { DDPRateLimiter } from "meteor/ddp-rate-limiter";
DDPRateLimiter.addRule(
{
type: "method",
name: "addItem",
userId: (userId) => Boolean(userId),
},
5, // operations
10000, // per 10s
);
```
Meteor 3.5+ permits async matcher functions for database-backed decisions. On
Meteor 3.0 through 3.4, matchers must stay synchronous; use a fixed rule,
precomputed synchronous state, or upgrade instead of awaiting Mongo in a
matcher.
Meteor awaits async matchers sequentially on the incoming connection's message
queue. Project only required fields and keep the lookup fast. A rejected
matcher Promise errors the invocation; test that path explicitly.
See `references/rate-limiting.md` for the rule-object schema and
per-connection vs per-user keys.
## Error handling
Throw `Meteor.Error(code, reason, details?)` for an intentional client-visible
failure. A plain `Error` is logged on the server and sanitized for the client
as `Meteor.Error(500, "Internal server error")`; its original message and
stack are not exposed. `Meteor.Error` carries its code, reason, and details.
Do not assume every `callAsync` rejection has that shape: callback misuse,
transport failures, and local stub exceptions can produce native or arbitrary
errors. Narrow the caught value before reading Meteor-specific fields.
## Anti-patterns
- Methods without `check()` on every argument. Reject the method in code
review.
- Reusing a method for both authenticated and unauthenticated calls. Split
into two methods.
- Awaiting browser macrotask APIs such as `fetch` or timers inside a client
stub. Async stubs are valid, but those APIs let unrelated code run before
the optimistic simulation finishes.
- Calling `Meteor.user()` inside an async method body. Use `this.userId`.
## See also
- `references/check-and-validate.md`
- `references/rate-limiting.md`
- `references/eval-cases.md`
@@ -0,0 +1,47 @@
# Validating method arguments
Every method argument must be validated. Two libraries: the built-in
`check` package and any third-party validator (Zod, Joi). For new code,
prefer `check`.
## Primitive shapes
```javascript
check(value, String); // string
check(value, Number); // number, including NaN. Use Match.Integer
// for integers.
check(value, Boolean);
check(value, Date);
check(value, Object); // any object
check(value, Array); // any array
check(value, null);
check(value, undefined);
```
## Composite
```javascript
check(value, {
title: String,
qty: Match.Integer,
tags: [String],
notes: Match.Optional(String),
meta: Match.ObjectIncluding({ source: String }),
});
```
## Union and refinement
```javascript
check(value, Match.OneOf(String, Number));
check(value, Match.Where((v) => typeof v === "string" && v.length <= 80));
```
## When to use Zod
If you already use Zod for HTTP boundaries, you can call `schema.parse(value)`
inside the method. The Meteor-specific `check` advantage is that mismatches
throw `Match.Error` which Meteor maps to a `400` DDP error automatically.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/check.md
@@ -0,0 +1,73 @@
# Evaluation cases for `meteor-methods`
## Case 1: missing check()
Prompt: "Add a method that updates a user's profile."
Pass if the agent (a) uses `check()` for every argument, (b) gates on
`this.userId`, (c) marks the method `async`, (d) uses `*Async` Mongo.
## Case 2: optimistic UI
Prompt: "How do I make my addItem method update the UI instantly without
waiting for the server?"
Pass if the agent explains client stubs and produces a local Minimongo stub
with the same name. Accept a synchronous stub or an async stub that only
awaits `*Async` Minimongo work. Fail if it performs external I/O in the stub.
## Case 3: rate limiting
Prompt: "Limit my login method to five attempts per minute per IP."
Pass if the agent uses `DDPRateLimiter.addRule` with `clientAddress` matcher
and `5, 60000`.
## Case 4: error shape
Prompt: "My method throws but the client only sees 'Internal server error'.
Why?"
Pass if the agent identifies that the method threw a plain `Error` instead of
`Meteor.Error`, and rewrites to `throw new Meteor.Error(code, reason)`.
## Case 5: shared async method stub
Prompt: "My method module is imported on client and server. Its handler is
`async` and calls `await Items.insertAsync(doc)`. Must I create a separate
synchronous client stub?"
Pass if the agent says `callAsync` supports the shared async stub and local
async Minimongo operation. It must prohibit macrotask APIs such as `fetch`,
timers, IndexedDB, and workers inside the stub.
## Case 6: async rate-limit matcher
Prompt: "On Meteor 3.5, rate-limit `reports.generate` only for users whose
subscription tier is not premium. The tier is stored in `Meteor.users`.
Explain the effect on connection message processing and what happens when the
matcher Promise rejects."
Pass if the agent uses an async `userId` matcher with
`findOneAsync`, notes that the matcher is awaited on the connection's message
queue, keeps the query projected and fast, and tests a rejected matcher
Promise. Fail if it calls synchronous Mongo from the matcher.
## Case 7: async matcher before Meteor 3.5
Prompt: "Our app is fixed on Meteor 3.4.1. Can a `DDPRateLimiter` matcher
await `Meteor.users.findOneAsync` to choose a subscription-tier rule?"
Pass if the agent says async matchers begin in Meteor 3.5, keeps the 3.4.1
matcher synchronous, and offers a fixed rule, precomputed synchronous state,
or a Meteor upgrade. Fail if it copies the 3.5 async matcher into 3.4.1.
## Case 8: local `callAsync` rejection shape
Prompt: "My client method stub throws a native `TypeError`, and the catch block
crashes again while reading `err.error`. Are all `callAsync` rejections
`Meteor.Error`?"
Pass if the agent says intentional server-visible failures should use
`Meteor.Error` but local, misuse, and transport failures may not, then narrows
the caught value before reading `error`, `reason`, or `details`.
@@ -0,0 +1,111 @@
# `DDPRateLimiter.addRule`
`DDPRateLimiter.addRule(matcher, n, ms)` rejects requests that exceed `n`
matches in `ms` milliseconds.
## Matcher shape
```text
{
type: "method" | "subscription",
name: string | RegExp | (name) => boolean,
userId: (userId) => boolean,
clientAddress: (addr) => boolean,
connectionId: (id) => boolean,
}
```
(Schema notation, not executable JavaScript.)
Any subset of keys is allowed. Missing keys match everything.
## Common patterns
```javascript
// Per-user method limit
DDPRateLimiter.addRule(
{ type: "method", name: "addItem", userId: (uid) => Boolean(uid) },
5,
10000,
);
// Per-IP login attempts
DDPRateLimiter.addRule(
{
type: "method",
name: "login",
clientAddress: () => true,
},
5,
60000,
);
// All publications, per user
DDPRateLimiter.addRule(
{ type: "subscription", userId: (uid) => Boolean(uid) },
100,
60000,
);
```
## Removing a rule
`addRule` returns an id. Pass it to `removeRule` to drop the limit (useful
for tests).
```javascript
const ruleId = DDPRateLimiter.addRule(
{ type: "method", name: "addItem" },
5,
10000,
);
// later, e.g. in a test teardown
DDPRateLimiter.removeRule(ruleId);
```
The default login rule shipped with `accounts-base` is removed by
`Accounts.removeDefaultRateLimit()`.
## Async matchers (Meteor 3.5+)
Matchers may return `Promise<boolean>`. Use this only when the rule must read
the database, because each matcher is awaited on the incoming connection's
message queue.
```javascript
DDPRateLimiter.addRule(
{
type: "method",
name: "reports.generate",
async userId(userId) {
if (!userId) return true;
const user = await Meteor.users.findOneAsync(userId, {
fields: { subscriptionTier: 1 },
});
return user?.subscriptionTier !== "premium";
},
},
2,
60000,
);
```
Keep synchronous matchers for values already present on the invocation. A
rejected async matcher fails the invocation; test that error path. Every
matcher field also contributes to the bucket key. Include `userId`,
`clientAddress`, or `connectionId` when the limit must be scoped rather than
global.
## Custom error message
```javascript
const ruleId = DDPRateLimiter.addRule(rule, 1, 60000);
DDPRateLimiter.setErrorMessageOnRule(
ruleId,
(data) => `Slow down. Try again in ${Math.ceil(data.timeToReset / 1000)}s.`,
);
```
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/DDPRateLimiter.md
@@ -0,0 +1,251 @@
---
name: meteor-modern-build-stack
description: >
Use when configuring or tuning the Meteor 3 modern build stack: SWC
transpiler, SWC-based minifier, modern @parcel/watcher, web-arch skipping
in development, .meteorignore, and the Rspack bundler integration via the
rspack Atmosphere package. Triggers on package.json "meteor": { "modern":
true }, .swcrc, swc.config.js, [Transpiler] Used Babel Fallback logs,
rspack.config.js, rspack.config.ts, defineConfig from @meteorjs/rspack, Meteor.compileWith*
helpers, Meteor.extendConfig, Meteor.extendSwcConfig vs Meteor.replaceSwcConfig,
Meteor.splitVendorChunk, Meteor.persistDevFiles, Meteor.disablePlugins,
Meteor.enablePortableBuild, HtmlRspackPlugin customization,
RSPACK_DEVSERVER_PORT, TOOL_NODE_FLAGS, pnpm workspaces, Rspack 2,
skeleton selection, PWA, Workbox and service-worker build setup.
Use this skill when the user asks about SWC vs Babel or Rspack configuration.
Route existing-app bundler migration to migrate-to-rspack, Blaze PWA
scaffolding to meteor-blaze, and jam:offline data to meteor-community-packages.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.3"
area: build
tagline: "Configure the Meteor 3 modern build stack (SWC transpiler/minifier, `@parcel/watcher`, web-arch skipping, Rspack integration)."
bundle: ["essentials"]
docs_synced_at: "2026-09-11"
license: MIT
---
# Modern build stack
The modern build stack is two independent tracks. Enable either or both.
1. **Meteor Bundler Optimizations** (Meteor 3.3+). One flag, SWC replaces
Babel, SWC minifier replaces Terser, `@parcel/watcher` replaces the
legacy watcher, development skips legacy archs.
2. **Rspack Bundler Integration** (Meteor 3.4+). Atmosphere package
delegates app-code compilation to Rspack. Tree shaking, ESM, code
splitting via HTTP, modern bundler plugins.
Standard current `meteor create` application skeletons ship both enabled.
Purposefully small or compatibility-oriented skeletons, including `minimal`
and `legacy`, may omit Rspack or the modern flag. Inspect the generated
`package.json` and `.meteor/packages` instead of inferring features only from
the Meteor version. For existing apps, enable optimizations first, then add
Rspack once the app code is standards-clean.
## Enable Meteor Bundler Optimizations
Add to `package.json`:
```json
"meteor": {
"modern": true
}
```
This enables SWC, the SWC minifier, the modern watcher, and dev-mode web
arch skipping. Each falls back to legacy when something is incompatible, so
this is backward compatible.
Opt out of pieces:
```json
"meteor": {
"modern": {
"transpiler": false,
"minifier": false,
"watcher": false,
"webArchOnly": false
}
}
```
Or scope SWC: `transpiler.excludeApp`, `transpiler.excludeNodeModules`,
`transpiler.excludePackages`, `transpiler.excludeLegacy`. Accept `true` or
an array of paths/regexes.
Verbose transpiler logs to diagnose Babel fallbacks:
```json
"meteor": {
"modern": {
"transpiler": { "verbose": true }
}
}
```
Look for `[Transpiler] Used Babel for <file> Fallback`. The common cause is
nested imports; see `references/meteor-bundler-optimizations.md`.
## Enable Rspack integration
```bash
meteor add rspack
```
On first run the package installs the project-level Rspack setup. App code
moves to Rspack; Meteor still handles Atmosphere packages and produces the
final bundle. Requires entry points in `package.json` and no nested imports
in app code. To migrate an existing app, use the `migrate-to-rspack` skill.
Inspect `.meteor/versions`, `package.json`, and the lockfile. Meteor
3.6-beta.0 pairs `rspack@1.4.0-beta360.0`, `@meteorjs/rspack@3.0.0-beta.1`
and Rspack 2.2.0; 3.5.2 retains the 1.3.0/2.2.0 integration pairing.
See [release pairings](references/rspack-config.md) and
[3.6 dependencies and workspaces](references/meteor-3.6-workspaces.md).
For Rspack 1-to-2 config migration, use `migrate-to-rspack`.
## Scaffolds, PWA and offline behavior
For new-app skeleton selection or framework-neutral PWA/Workbox setup, read
[scaffolds and service workers](references/scaffolds-and-pwa.md).
Meteor 3.6 (verified on `3.6-beta.0`) adds separate `--pnpm` workspace and
`--pwa` Blaze starters; neither converts an existing app. A worker caches
shell/assets, not offline Meteor data. Existing bundler migrations remain
owned by `migrate-to-rspack`.
## SWC config files
```text
.swcrc > swc.config.js > swc.config.ts
```
Only the first found is used. Use `.swcrc` for static config, `swc.config.js`
for environment-driven config. The file name must be exactly `.swcrc`, not
`config.swcrc`.
Install `@swc/helpers` to externalize SWC helpers (smaller bundles):
```bash
meteor npm install --save @swc/helpers
```
New apps ship with this preinstalled. Normally no further setup is needed;
Meteor's pipeline detects it and emits imports instead of inlining. If only a
production or legacy bundle fails on a helper import, inspect Rspack-generated
and final Meteor output before changing `.swcrc` or adding manual imports.
## Rspack config files
```text
rspack.config.js | rspack.config.ts | rspack.config.mjs | rspack.config.cjs
```
Use `defineConfig` from `@meteorjs/rspack`. The function receives a
`Meteor` parameter with build flags and helpers. See
`references/rspack-config.md` for the full table and the most useful
helpers (`extendSwcConfig`, `compileWithRspack`, `compileWithMeteor`,
`extendConfig`, `splitVendorChunk`, `persistDevFiles`, `disablePlugins`,
`enablePortableBuild`, `setCache`).
## .meteorignore
Skip directories the bundler does not need to watch. Same syntax as
`.gitignore`. Place at any depth; rules apply to the subtree.
```gitignore
docs/
design/
cypress/
scripts/
*.md
!README.md
```
For per-command rules, set the `METEOR_IGNORE` env var.
Do not copy `.gitignore` into `.meteorignore` blindly. Exclude unrelated large
trees that Meteor does not need, but never match the active Rspack build context:
Meteor consumes its generated main and test modules during final assembly.
Rspack also generates `_build/`, `public/build-assets/`,
`public/build-chunks/`, and `private/build-assets/`. Include active suffixed
variants such as `build-assets-test` and `build-chunks-app-test` on Meteor
3.5.2, plus custom context names. Add those paths to the
native ignore configuration of recursive formatters, linters, typecheckers,
test discovery, coverage, and IDEs. `.gitignore` alone is insufficient.
## Minifier ownership
`"modern": true` selects Meteor's modern standard minifier. A third-party
Atmosphere package that provides the JavaScript minifier remains part of the
final Meteor assembly even when Rspack compiles app modules. Inventory custom
minifier packages before migration. Keep or remove one only after comparing
production output, source maps, build time, and runtime behavior.
## Production legacy builds
Dev skips `web.browser.legacy` and `web.cordova` with `"modern": true`.
Production still ships legacy by default. To drop legacy in production
too, add `modern` to `.meteor/platforms`:
```text
server
browser
modern
```
## Memory limits
Rspack runs as a child process and may OOM on large apps. Raise the heap
for tool processes temporarily when capturing evidence (Meteor 3.4.1+):
```bash
TOOL_NODE_FLAGS="--max-old-space-size=16384" meteor run
```
On Meteor 3.4.0, use `NODE_OPTIONS="--max-old-space-size=16384"`.
First distinguish a one-shot build failure from growth during a long watch
session. Audit large directories visible to Meteor and check the exact release
for fixes. Test heap size and persistent cache as separate variables; revert a
change that does not improve the failure or a measured memory trend.
## Multiple instances
Meteor 3.5.2 separates development, normal test, and full-app test output
within one context (`_build/main-dev`, `_build/test`, `_build/app-test`, plus
mode-suffixed assets/chunks). This does not isolate Meteor caches, local Mongo,
or ports. For separate local state or two instances of the same mode, use
distinct ports and `METEOR_LOCAL_DIR` values; older integrations also need this
for cross-mode output isolation:
```bash
PORT=3000 METEOR_LOCAL_DIR=.meteor/local-1 meteor run
PORT=3001 METEOR_LOCAL_DIR=.meteor/local-2 meteor run
```
## Anti-patterns
- Enable optimizations and Rspack at the same time on a legacy app. Enable
`"modern": true` first, clean up Babel fallbacks, then add Rspack.
- Edit files inside `_build/`, `public/build-assets/`,
`public/build-chunks/`, or `private/build-assets/`. Autogenerated.
- Assume `.gitignore` prevents code-quality tools from scanning generated
Rspack output. Configure each tool's own ignore mechanism.
- Copy `.gitignore` to `.meteorignore`. Git may ignore Rspack's generated
handoff even though Meteor must read it.
- Remove a custom Atmosphere minifier only because Rspack is enabled.
Benchmark the final production bundle first.
- Disable Rspack persistent cache without need. It is the default and the
main rebuild-speed win. Disable only when investigating OOM or a
cache-related Rspack bug.
- Name an SWC config `config.swcrc` or `rc.swc`. Only `.swcrc` is read.
## See also
- `references/meteor-bundler-optimizations.md`
- `references/rspack-config.md`
- `references/eval-cases.md`
- For converting an existing app to Rspack: `migrate-to-rspack` skill.
@@ -0,0 +1,310 @@
# Evaluation cases for `meteor-modern-build-stack`
## Case 1: enable optimizations
Prompt: "How do I turn on the modern build stack? My app is on Meteor 3.3."
Pass if the agent adds `"meteor": { "modern": true }` to `package.json`,
notes it is backward compatible (Babel fallback for incompatible files),
and points the user at `transpiler.verbose` to inspect fallbacks before
investing in migration.
## Case 2: silent Babel fallback
Prompt: "I enabled modern but builds feel the same. How do I tell whether
SWC is actually being used?"
Pass if the agent suggests
`"meteor": { "modern": { "transpiler": { "verbose": true } } }`, points to
the `[Transpiler] Used Babel for <file> Fallback` log, and lists the
common causes (nested imports, JSX in `.js`, Babel-only plugin) with their
SWC equivalents.
## Case 3: alias works for import, not require
Prompt: "I added an alias to `.swcrc`. `import x from "@ui/x"` works but
`require("@ui/x")` does not. Why?"
Pass if the agent explains SWC resolves aliases for `import` only, and
proposes either converting the `require` to an `import` or using a
relative path.
## Case 4: native dep crashes with Rspack
Prompt: "After `meteor add rspack`, my server crashes with
`Cannot find module '/_build/main-dev/lib/worker.js'`."
Pass if the agent identifies the `thread-stream` (or analogous worker-loading)
dependency, and shows
`Meteor.compileWithMeteor(["thread-stream"])` in `rspack.config.js` to
let Meteor/Node handle it instead of Rspack.
## Case 5: OOM on Rspack build
Prompt: "`meteor build` runs out of memory after I added Rspack."
Pass if the agent recommends
capturing the exact mode and release, distinguishes a one-shot build from a
long watch session, audits large trees visible to Meteor, and tests one variable
at a time. It may use `TOOL_NODE_FLAGS` on 3.4.1+ or `NODE_OPTIONS` on 3.4.0 as a
temporary mitigation. It may test `Meteor.setCache(false)` separately. Fail if
it stacks both changes without measuring or checking known release fixes.
## Case 6: custom minifier with Rspack
Prompt: "I enabled Rspack but still have a third-party
`standard-minifier-js` Atmosphere package. Should I delete it automatically?"
Pass if the agent explains that Meteor still performs final bundle assembly,
inventories which package owns JavaScript minification, and compares
production output before removing it. Fail if it assumes Rspack makes every
Meteor minifier package irrelevant.
## Case 7: generated output enters typecheck
Prompt: "After the first Rspack build, TypeScript and ESLint inspect
`_build` and `public/build-chunks`, even though Git ignores them."
Pass if the agent adds Rspack output folders to each tool's native ignore and
verifies those tools after generated output exists.
## Case 8: build context hidden from Meteor
Prompt: "`_build` is generated and already Gitignored, so I added it to
`.meteorignore`. Now Meteor cannot find `server-meteor.js`."
Pass if the agent removes the active build context from `.meteorignore`,
explains that it is the Rspack-to-Meteor handoff, checks custom context names,
and still excludes it from unrelated tools.
## Case 9: helper fails only in the legacy bundle
Prompt: "Modern browsers work, but the production legacy bundle imports a
missing SWC helper. Should I add side-effect helper imports to app startup?"
Pass if the agent inspects source, Rspack output, the generated Meteor-facing
module, and final legacy output to identify the first failing stage. It should
check the exact release for a framework fix and avoid speculative app imports
or global `.swcrc` changes.
## Case 10: compose nested Rspack config
Prompt: "Two Rspack presets both add nested `resolve` and `module` settings.
Shallow object spread makes one replace the other. Which Meteor helper should I
use?"
Pass if the agent uses `Meteor.extendConfig` to merge the fragments and checks
the verbose final configuration. Fail if it confuses this with
`extendSwcConfig`, which applies only to SWC options.
## Case 11: custom service worker filename in development
Prompt: "On Meteor 3.4.1, Workbox generates `service-worker.js`, but Meteor's development web
server cannot serve it unless every rebuild writes it to disk. Rewriting it also
forces a page reload."
Pass if the agent uses `Meteor.persistDevFiles({ once: ['service-worker.js'] })`,
keeps HMR updates out of the service-worker cache, and notes that production
output is written normally. It must identify Meteor 3.4.1 and
`@meteorjs/rspack` v2 as the minimum.
## Case 12: replace a default Rspack plugin
Prompt: "I need to replace a default HTML-related Rspack plugin with a custom
one. How do I disable only the existing plugin?"
Pass if the agent uses `Meteor.disablePlugins` with a constructor name, regex,
or predicate, then adds and validates the replacement. Fail if it mutates the
generated config or disables unrelated plugins.
## Case 13: one bundle for staging and production
Prompt: "We build once and deploy the same artifact to staging and production,
but Rspack removes the inactive `Meteor.isDevelopment` branch at build time."
Pass if the agent explains the default static replacement and uses
`Meteor.enablePortableBuild()` only when runtime portability outweighs the
larger bundle. It must not claim that `Meteor.isClient`, `isServer`, or `isTest`
become portable runtime flags.
## Case 14: TypeScript Rspack config
Prompt: "Will Meteor discover `rspack.config.ts`, or must I rename it to
JavaScript?"
Pass if the agent lists `.ts` as a supported project-level Rspack config name
alongside `.js`, `.mjs`, and `.cjs`. It should preserve `defineConfig` from
`@meteorjs/rspack` and avoid inventing a custom config path setting.
## Case 15: two local Rspack instances
Prompt: "I run two copies of one Rspack-enabled Meteor app. Their Meteor ports
and `METEOR_LOCAL_DIR` values differ, but the second Rspack dev server still
reports a port collision."
Pass if the agent also assigns a distinct `RSPACK_DEVSERVER_PORT` to each
process and explains that `devServer.port` in `rspack.config` is reserved by
the Meteor integration.
## Case 16: helper unavailable on Rspack v1
Prompt: "My app must remain on Meteor 3.4.0 with `@meteorjs/rspack@1.0.0`.
Can I copy a current example that uses `Meteor.persistDevFiles` and
`Meteor.enablePortableBuild`?"
Pass if the agent says both helpers require Meteor 3.4.1+ and
`@meteorjs/rspack` v2, inspects the resolved integration versions, and offers
either a Meteor upgrade or direct Rspack configuration with equivalent tested
behavior. Fail if it installs v2 independently into the Meteor 3.4.0 pairing
or claims every helper documented on `devel` exists in Rspack v1.
## Case 17: unexplained performance near miss
Prompt: "After an update, startup feels slow, but I do not know whether the
time is in the Meteor build, spawned server startup, or the first browser load.
Which Rspack setting should I change?"
Pass if the agent uses `meteor-debugging` first to measure and separate the
tool, server, and browser boundaries. It should return to this skill only when
evidence identifies SWC, Rspack, watcher, cache, or build configuration. Fail
if it changes Rspack settings before locating the slow boundary.
## Case 18: dependency opt-out on Meteor 3.5.2
Prompt: "Our Meteor 3.5.2 build must not modify package.json or the lockfile.
With `autoInstallDeps: false`, it prints a missing `@swc/helpers` warning and
later fails. Should I ignore the warning? Would running `meteor update --npm`
in CI still honor the opt-out?"
Pass if the agent checks resolved integration versions, explains opt-out still
checks minimums on `rspack@1.3.0`, installs the reported runtime dependency
locally, reviews and commits dependency files, and uses a clean CI install with
build-time dev dependencies. It explains that explicit `meteor update --npm`
overrides the opt-out for that invocation. Fail if it installs helpers as
dev-only, relies on CI auto-repair, or treats warning output as validation.
## Case 19: earlier dependency opt-out
Prompt: "Our app must stay on Meteor 3.5.1 with `rspack@1.2.0` and
`autoInstallDeps: false`. Missing dependencies produce no helpful warning.
Was automatic installation first introduced in 3.5.2?"
Pass if the agent distinguishes existing auto-install/opt-out support from the
3.5.2 shared-manager diagnostics, says the earlier opt-out can skip checks, and
verifies dependencies manually without silently upgrading the fixed release.
## Case 20: mixed build modes and generated ignores
Prompt: "On Meteor 3.5.2, development and full-app tests run in one checkout.
Do I need separate METEOR_LOCAL_DIR values only to stop Rspack cleanup deleting
the other mode's output? ESLint now scans public/build-chunks-app-test too."
Pass if the agent explains automatic mode output isolation, retains separate
ports and local state when needed, and covers actual suffixed/custom output in
ESLint's native ignores. It must not hide Meteor's handoff in `.meteorignore`
or promise that separate output isolates the local database.
## Case 21: TypeScript config cache boundary
Prompt: "On Meteor 3.5.2 with `@meteorjs/rspack@2.2.0`, rspack.config.ts
imports `./config/alias.ts` and also computes a dynamic import path. Will every
dependency edit invalidate persistent cache, including on our 3.5.1 branch?"
Pass if the agent distinguishes resolvable relative literal imports/re-exports
from computed or out-of-app paths, verifies the next build before cleanup,
and does not extend the TypeScript tracking fix to older integrations. Fail if
it disables persistent cache by default or guarantees arbitrary path tracking.
## Case 22: 3.6 beta dependency pairing
Prompt: "We are on Meteor 3.6-beta.0 with autoInstallDeps false. Which Rspack integration versions should we reconcile before our frozen CI build?"
Pass if the agent: Checks the resolved Atmosphere/npm pairing, uses rspack 1.4.0-beta360.0 and @meteorjs/rspack 3.0.0-beta.1 rather than a presumed stable 3.0.0, reconciles the coordinated dependencies locally, and preserves the lockfile in CI.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 23: pnpm workspace install ownership
Prompt: "Meteor 3.6-beta.0 runs from apps/app in a pnpm workspace. The root pins pnpm but the app has an old npm packageManager hint. Where should required Rspack installs run, and which lockfile should change?"
Pass if the agent: Uses the root manager and shared pnpm lockfile with the app as install cwd; does not create an app package-lock or require global pnpm when Corepack is available. Preserves existing locks and local work while investigating conflicting hints, rather than prescribing deletion from the hint alone. Does not forbid pnpm-managed links under apps/app/node_modules.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 24: local protocol dependencies
Prompt: "Our 3.6 beta workspace declares a required Rspack helper with workspace: and another with file:. Should the tool treat these strings as bad semver and replace them with registry versions?"
Pass if the agent: Inspects installed package versions and protocol targets, preserves intentional local sources, and does not apply registry semver parsing to protocol strings.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 25: older workspace near miss
Prompt: "We are pinned to Meteor 3.5.2 and want the new pnpm monorepo scaffold and automatic workspace dependency handling without upgrading. Can we use the 3.6 commands unchanged?"
Pass if the agent: States the 3.6 beta boundary; offers existing/manual workspace setup or an explicitly scoped upgrade, not unsupported flags or guaranteed new automatic behavior.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 26: React PWA with Workbox and offline data
Prompt: "Our Meteor 3.6-beta.0 React app already uses Rspack. We want a PWA
like Notes Offline. Should we convert to the new Blaze skeleton, copy its
worker, or use Workbox? Will the worker save Minimongo and replay edits?"
Pass if the agent keeps React, uses this skill for the worker/build decision,
and distinguishes optional Workbox or an app-owned worker from the new Blaze
starter. It uses Notes Offline as a React/Workbox example with separate
`jam:offline`/`jam:method` data behavior, routes data adoption to
`meteor-community-packages`, and requires offline/update/reconnect and
account-boundary checks. Fail if it treats startup as offline proof, caches
private traffic indiscriminately, or promises worker-provided method replay.
## Case 27: new pnpm workspace starter
Prompt: "Start a Meteor 3.6-beta.0 pnpm workspace with shared client and server
packages. Where is the Meteor app, how do I start it, and does the pnpm
skeleton include PWA offline behavior?"
Pass if the agent uses `meteor create --release 3.6-beta.0 --pnpm <name>`,
identifies `apps/app` and `packages/`, and explains the root start script
without switching dependency ownership to npm. It preserves the root pnpm
pin and lockfile, runs direct Meteor commands from the app, and treats PWA
as separate work. Fail if it invents offline support or requires global pnpm
when Corepack supplies the pinned version.
## Case 28: skeleton selection is not flag composition
Prompt: "For a new Meteor 3.6-beta.0 app, should I use --react, --typescript,
--svelte, --pnpm or --pwa? Can I combine --react --pnpm --pwa to get all three?
Does meteor create --list show every skeleton?"
Pass if the agent distinguishes framework choice, workspace layout and PWA
requirements, preserves the requested framework, and explains that `--pwa`
selects a Blaze starter rather than a generic modifier. It checks the selected
release's CLI/generated files instead of inventing composable flags, and
distinguishes the examples list from skeleton discovery. Fail if it promises
every skeleton enables the same stack or silently chooses another framework.
## Case 29: PWA setup on an earlier stable release
Prompt: "Our React app must remain on Meteor 3.5.2 with @meteorjs/rspack 2.2.0.
Can we still use Workbox for a PWA, or does all PWA support require the new
Meteor 3.6 --pwa option?"
Pass if the agent keeps the pinned app, explains that Workbox/app-owned
workers are independent of the new Blaze starter, and identifies the
Meteor 3.4.1/v2 floor for documented worker persistence helpers. It preserves
the paired integration and tests dev/production worker behavior separately
from offline data. Fail if it requires upgrading to 3.6, running a scaffold
over the app, or installing a newer integration major on its own.
## Case 30: narrower worker scope is valid
Prompt: "Our Meteor 3.6 React PWA is under /portal/ but serves its worker at
/sw.js. Can we register that worker with scope /portal/, or must we move it?
What if /portal/sw.js instead requests scope /?"
Pass if the agent allows the root script's narrower `/portal/` scope, explains
that the default is the script directory, and distinguishes a broader scope
requiring the worker response's `Service-Worker-Allowed` header. It checks
actual registration and avoids unnecessarily broad control or an automatic
prefix rewrite. Fail if it requires moving a root worker to narrow its scope
or treats broader-than-directory scope as always impossible or unrestricted.
@@ -0,0 +1,101 @@
# Meteor 3.6 dependencies and workspaces
These decisions start with Meteor 3.6, verified on `3.6-beta.0` with
`rspack@1.4.0-beta360.0` and `tools-core@1.4.0-beta360.0`. Earlier 3.x releases
keep their existing integration and manually managed workspace setup. Inspect
the app's release, resolved packages, manifest and workspace lockfile before
using a beta-specific version or command.
## Rspack 2 dependency set
| Package | Minimum selected by 3.6-beta.0 | Dependency category |
|---|---|---|
| `@meteorjs/rspack` | `3.0.0-beta.1` | Development |
| `@rspack/core`, `@rspack/cli`, `@rspack/dev-server` | `2.2.0` each | Development |
| `@swc/core` | `1.15.32` | Development |
| `@rsdoctor/rspack-plugin` | `1.5.9` | Development |
| `@swc/helpers` | `0.5.23` | Runtime |
| React only: `@rspack/plugin-react-refresh`, `react-refresh` | `2.0.0`, `0.17.0` | Development |
`swc-loader@0.2.6` remains a separately selected dependency when the integration
needs it. Do not confuse the Meteor npm integration's major 3 with Rspack's
major 2. Do not substitute unreleased stable `@meteorjs/rspack@3.0.0` for this
beta's pin. Later releases require checking their own resolved pairing.
Automatic installation updates the coordinated set. With
`meteor.autoInstallDeps: false`, inspect the warnings and prepare the changes
locally with the detected manager. `meteor update --npm` explicitly overrides
the opt-out for that invocation; keep it out of immutable CI builds.
On npm apps with installed Rspack 1.x core, CLI, or React Refresh peers,
the beta's automatic transition uses `--legacy-peer-deps`. Its manual warning
can omit that flag. If the reported dependency update fails with the confirmed
old-peer conflict, apply the flag only to that coordinated npm install and
verify the resulting tree. Do not set a global npm option, add the flag to
pnpm/Yarn, or suppress unrelated peer errors. Prove the locked CI install
works; if that lockfile requires the same npm flag, document it in that app's
CI command and revisit it after the transition.
## Create a pnpm workspace
```bash
meteor create --release 3.6-beta.0 --pnpm my-workspace
cd my-workspace
meteor npm start
```
Inspect the generated structure:
```text
package.json # packageManager pin and root scripts
pnpm-workspace.yaml
pnpm-lock.yaml
apps/app/.meteor/release # Meteor commands target this app
apps/app/package.json # app dependencies and workspace:* links
packages/domain/ # shared npm package
packages/server-tools/ # server-only npm package
packages/ui/ # client npm package
```
Creation installs through pnpm, using Corepack when available. A global pnpm
installation is not required when Corepack can supply the pinned version.
`meteor npm start` runs the root script; it does not make npm the workspace's
dependency manager. Run direct Meteor commands from `apps/app`.
For a Meteor 3.5.2 or earlier app that must stay pinned, do not use `--pnpm`
or promise the new detection. Keep its established workspace and manager,
prepare dependencies explicitly, and verify linked imports and builds.
## Preserve installation ownership
1. Find the workspace root, root `packageManager`, workspace manifest and
lockfile. The root manager takes precedence over the nested app's hint.
2. Install app dependencies from the Meteor app directory with that manager,
so the app manifest and shared workspace lockfile change together. Do not
add them to the root manifest or create a competing `package-lock.json`.
If conflicting hints or lockfiles already exist, inspect their history and
preserve local changes before selecting an authority. Do not delete an
existing lockfile or `node_modules` merely because npm was mentioned.
pnpm can legitimately create `apps/app/node_modules` links; a shared root
lockfile does not require a root-only `node_modules` tree.
3. Keep `file:`, `link:`, `portal:` and `workspace:` declarations when they
are intentional. Check the actual installed package version and linkage;
the protocol text is not a semver range. Repair missing links or an
incompatible source version instead of replacing every link with a
registry dependency.
4. npm, pnpm and Yarn can auto-install. Other declared managers receive
manual guidance without automatic mutation. A failed pnpm/Yarn executable
can fall back to Corepack; inspect its error rather than switching managers.
5. Review both manifests and the authoritative lockfile, then use a frozen
install from the workspace root in CI: `pnpm install --frozen-lockfile`,
`yarn install --immutable` for modern Yarn, or the project's npm workflow.
Yarn Classic uses `--frozen-lockfile`. Include build-time dev dependencies.
Keep default symlink resolution for packages imported by name. Only an
app-local source symlink that needs its apparent location calls for
`resolve.symlinks: false`. Test shared client/server imports, an edit to a
linked package, client/server suite counts, and an extracted production bundle.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/modern-build-stack/rspack-bundler-integration.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/index.md
@@ -0,0 +1,244 @@
# Meteor Bundler Optimizations
`"meteor": { "modern": true }` in `package.json` enables: SWC transpiler,
SWC-based minifier, modern watcher, web-arch skipping in development. All
fall back to legacy behavior on incompatibility.
## Transpiler (SWC)
SWC replaces Babel for `.js`, `.jsx`, `.ts`, `.tsx` across app, npm, and
Atmosphere packages. Faster, no Fibers tax.
### Verbose output
```json
"meteor": {
"modern": {
"transpiler": { "verbose": true }
}
}
```
Each file logs which transpiler ran. Babel fallbacks log
`[Transpiler] Used Babel for <file> (<context>) Fallback`.
### Excluding files from SWC
When a file is known-incompatible, skip SWC entirely to avoid the fallback
overhead.
```json
"meteor": {
"modern": {
"transpiler": {
"excludeApp": ["\\.jsx"]
}
}
}
```
`excludeApp`, `excludeNodeModules`, `excludePackages`, `excludeLegacy`:
each accepts `true` (always Babel) or an array of paths/regex-like
patterns.
### Externalize SWC helpers
```bash
meteor npm install --save @swc/helpers
```
Meteor's pipeline detects it and emits imports for shared helpers instead
of inlining `_extends`, `_objectSpread`, etc. into every file. Preinstalled
on new apps. No `.swcrc` change is normally required. If only a production or
legacy build fails on a helper import, compare the source, Rspack output,
generated Meteor-facing module, and final bundle before changing helper config.
The later Meteor assembly can transform generated Rspack output too.
### Custom `.swcrc`
Lookup order: `.swcrc` > `swc.config.js` > `swc.config.ts`. Only the
first match is used. File name must be exactly `.swcrc`.
Add SWC plugins, JSX-in-JS support, or React runtime config here.
```json
{
"jsc": {
"parser": { "syntax": "ecmascript", "jsx": true },
"transform": {
"react": { "runtime": "automatic" }
}
}
}
```
For TypeScript: `"syntax": "typescript"` and `"tsx": true`.
### Import aliases via SWC
```json
{
"jsc": {
"baseUrl": "./",
"paths": { "@ui/*": ["ui/*"] }
}
}
```
SWC resolves aliases for `import`. It does NOT resolve aliases for
`require(...)` calls. Use an `import` or a relative path for those.
For dynamic aliases by env, use `swc.config.js`:
```javascript
var mode = process.env.MODE_ENV;
module.exports = {
jsc: {
baseUrl: "./",
paths: mode === "USER" ? { "@ui/*": ["user/*"] }
: { "@ui/*": ["admin/*"] },
},
};
```
### Transform-imports plugin
To shrink full-package imports (e.g. lodash):
```bash
meteor npm install -D @swc/plugin-transform-imports
```
```json
{
"jsc": {
"experimental": {
"plugins": [[
"@swc/plugin-transform-imports",
{
"lodash": {
"transform": "lodash/{{member}}",
"preventFullImport": true
}
}
]]
}
}
}
```
Rewrites `import { map } from "lodash"` into `import map from "lodash/map"`.
### Private class fields
SWC parses `#privateField`, `#privateMethod()`, static private members
natively. No `.swcrc` change required. Babel does not parse them in Meteor;
SWC does.
### Common Babel fallback causes
| Cause | Fix |
|------------------------------------|--------------------------------------------------------------|
| Nested imports | Move to top-level, or use dynamic `import()` / `require`. |
| JSX in `.js` files | Add `jsc.parser.jsx: true` in `.swcrc`. |
| Babel-only plugin (e.g. React Compiler) | Either keep Babel via `excludeApp: true`, or wait. |
| Custom babel-plugin-module-resolver | Move aliases to `.swcrc`'s `jsc.paths`. |
## Minifier (SWC-based)
Replaces Terser in production builds. Same flag (`"modern": true`). Opt out:
```json
"meteor": {
"modern": { "minifier": false }
}
```
This flag controls Meteor's standard minifier path. If `.meteor/packages`
contains a third-party package that provides the JavaScript minifier, do not
assume the flag replaces it. Rspack compiles app modules, then Meteor still
assembles and minifies the final bundle. Compare production output with and
without the custom package before choosing one implementation.
## Watcher (`@parcel/watcher`)
Native cross-OS file watcher. Opt out:
```json
"meteor": {
"modern": { "watcher": false }
}
```
For WSL, remote volumes, or unstable inotify, force polling:
```bash
METEOR_WATCH_FORCE_POLLING=true meteor run
METEOR_WATCH_POLLING_INTERVAL_MS=1000 METEOR_WATCH_FORCE_POLLING=true meteor run
```
Polling burns CPU but is the reliable option in those environments.
## Web Arch (dev only)
`"modern": true` makes development skip `web.browser.legacy` and
`web.cordova`. Equivalent to `--exclude-archs web.browser.legacy,web.cordova`.
Opt out:
```json
"meteor": {
"modern": { "webArchOnly": false }
}
```
This only affects development. To drop legacy from production, add
`modern` to `.meteor/platforms`:
```text
server
browser
modern
```
## .meteorignore
`.gitignore` syntax. Place at any directory level; applies to the subtree.
Lets Meteor skip docs, design assets, infra, test runners, scripts.
```gitignore
docs/
design/
mockups/
cypress/
playwright/
scripts/
tools/
*.md
!README.md
```
Subdirectory `.meteorignore` files are honored; for example one inside
`packages/<pkg>/` scopes only to that package's tree.
For per-command rules without committing the file, use the
`METEOR_IGNORE` environment variable.
Do not synchronize `.gitignore` and `.meteorignore` mechanically. Gitignored
Rspack build contexts contain generated main and test modules that Meteor reads
during final assembly, so they must remain visible to Meteor. For performance,
report large unrelated trees that Git ignores but Meteor still scans, then add
anchored `.meteorignore` rules only after proving they are not application or
test inputs.
## Profiling
Run `meteor profile` before and after enabling `"modern": true` to
quantify the improvement.
## Troubleshooting
- `meteor reset` clears the build cache.
- Delete `.meteor/local/` to force a clean rebuild.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/modern-build-stack/meteor-bundler-optimizations.md
@@ -0,0 +1,348 @@
# Customizing `rspack.config.js`
The `rspack` Atmosphere package generates a `rspack.config.js` at install
time. Edit it with `defineConfig` from `@meteorjs/rspack`. Accepted names are
`rspack.config.js`, `rspack.config.ts`, `rspack.config.mjs`, and
`rspack.config.cjs`.
Match both integration packages to the Meteor release:
| Meteor | `rspack` | `@meteorjs/rspack` | Capability boundary |
|---|---|---|---|
| 3.4 | `1.0.0` | `1.0.0` | Base helpers, including `extendConfig`, `disablePlugins`, and `RSPACK_DEVSERVER_PORT`. |
| 3.4.1 and 3.5 | `1.1.0` | `2.0.1` | Adds `replaceSwcConfig`, `persistDevFiles`, `enablePortableBuild`, and inherited `TOOL_NODE_FLAGS`. |
| 3.5.1 | `1.2.0` | `2.1.0` | Revised client polyfills and app-extension discovery; retains the v2 helper API. |
| 3.5.2 | `1.3.0` | `2.2.0` | Required-dependency diagnostics, mode isolation, TypeScript config dependency tracking, and full-app/TLA fixes. |
| 3.6-beta.0 | `1.4.0-beta360.0` | `3.0.0-beta.1` | Rspack 2.2.0, SWC React Compiler, workspace-aware installs and stable cache configuration. |
Inspect `.meteor/versions`, `package.json`, and the lockfile. Do not install an
arbitrary `@meteorjs/rspack` major to obtain one helper; upgrade the Meteor
release and its paired dependencies.
## Required npm dependencies
With `rspack@1.3.0` and `tools-core@1.3.0` (Meteor 3.5.2), the shared manager
checks required minimums even when `meteor.autoInstallDeps` is `false` in
`package.json`. With automatic installation enabled, it installs missing or
outdated dependencies and reports changes. A satisfied dependency set is quiet.
During an ordinary build with automatic installation disabled, it prints the missing/outdated versions
and manual install commands without changing project dependencies. It continues
the build, which can still fail because those dependencies are missing. Treat
the warning as a dependency problem, not as a successful compatibility check.
An explicit `meteor update --npm` overrides the opt-out for that invocation
without changing the stored flag. Use it during authorized dependency
preparation; keep it out of an immutable CI build.
```json
{
"meteor": {
"autoInstallDeps": false
}
}
```
For the 3.5.2 pairing, the core minimums are `@rspack/core` and `@rspack/cli`
1.7.1, `@meteorjs/rspack` 2.2.0, `@rsdoctor/rspack-plugin` 1.5.7, and
`@swc/helpers` 0.5.17. Keep `@swc/helpers` in runtime dependencies; the others
are build-time dev dependencies. React adds its detected refresh dependencies.
Use the versions and categories reported by the resolved integration instead
of copying these minimums to another release.
Automatic installation and the opt-out already exist in Meteor 3.5.1. That
release skips the checks when opted out and does not provide the new warning
contract. Inspect its dependencies manually or upgrade the paired integration.
For reproducible CI/Docker, resolve dependencies locally, review and commit
`package.json` and its lockfile, and use `meteor npm ci` for npm apps in the build stage
with dev dependencies available. When build-time dependency mutation is
prohibited, keep the opt-out in project configuration and resolve every warning
before CI. Do not rely on a container silently repairing an incomplete lockfile.
For Meteor 3.6-beta.0's coordinated npm peer transition, new dependency minimums,
pnpm scaffold and workspace-owned installs, read
[3.6 dependencies and workspaces](meteor-3.6-workspaces.md).
Keep the existing manager and its frozen-install command in a workspace.
## Rspack 2 configuration boundary
Meteor 3.6-beta.0 supplies CSS through `css/auto`, persistent options under
top-level `cache`, `externalsType: "commonjs2"`, and compatible output settings.
Preserve those defaults. Use `migrate-to-rspack` to review app overrides that
still contain `experiments.css`, `experiments.cache`, `output.libraryTarget`,
or a hand-written `webpack-merge` integration.
Rspack 2's built-in SWC loader no longer discovers `.swcrc` itself, but
`@meteorjs/rspack@3.0.0-beta.1` still reads Meteor's `.swcrc`, `swc.config.js`
or `swc.config.ts` and passes options to the loader. Do not remove a working
Meteor SWC file based only on the generic Rspack migration guide. Inspect the
effective configuration; extend it with `Meteor.extendSwcConfig`.
## Configuration example
```javascript
const { defineConfig } = require('@meteorjs/rspack');
const { rspack } = require('@rspack/core');
module.exports = defineConfig(Meteor => ({
plugins: [
Meteor.isClient && new rspack.ProvidePlugin({ _: 'lodash' }),
new rspack.ProgressPlugin(),
].filter(Boolean),
}));
```
## Flags on the `Meteor` parameter
| Flag | Type | Meaning |
|------------------|---------|------------------------------------------------------|
| `isDevelopment` | boolean | dev mode |
| `isProduction` | boolean | prod mode |
| `isClient` | boolean | building client code |
| `isServer` | boolean | building server code |
| `isTest` | boolean | test mode |
| `isDebug` | boolean | debug mode |
| `isRun` | boolean | `meteor run` |
| `isBuild` | boolean | `meteor build` |
| `swcConfigOptions` | object | project-level SWC config (reuse in custom loaders) |
| `assetsContext` | string | name of the build-assets folder |
| `chunksContext` | string | name of the build-chunks folder |
## Helpers
### `extendConfig`
Deep-merge reusable or conditional Rspack configuration fragments without
replacing sibling nested keys:
```javascript
module.exports = defineConfig(Meteor => ({
...Meteor.extendConfig(
{ resolve: { alias: { '@ui': '/imports/ui' } } },
Meteor.isClient ? { module: { rules: [clientRule] } } : {},
),
}));
```
Use direct properties for one small config. Use `extendConfig` when composing
multiple nested fragments or presets. Inspect verbose final config to confirm
the merge result.
### `extendSwcConfig` and `replaceSwcConfig`
Both apply only to app code (Meteor packages keep their own SWC config).
`extendSwcConfig` exists in Meteor 3.4+. `replaceSwcConfig` requires Meteor
3.4.1+ and `@meteorjs/rspack` v2.
```javascript
// Smart-merge custom options onto Meteor's SWC defaults
...Meteor.extendSwcConfig({
jsc: { parser: { decorators: true } },
})
```
```javascript
// Replace Meteor's SWC config entirely. You own React-refresh, helpers, etc.
...Meteor.replaceSwcConfig({
jsc: {
parser: { syntax: 'typescript', tsx: true, decorators: true },
target: 'es2020',
transform: { react: { runtime: 'automatic' } },
},
})
```
Prefer `extendSwcConfig`. `replaceSwcConfig` requires re-supplying React
refresh, external-helpers, etc. that Meteor sets up via `Meteor.swcConfigOptions`.
### `compileWithRspack` / `compileWithMeteor`
Routes specific npm deps to one bundler or the other.
```javascript
module.exports = defineConfig(Meteor => ({
// Force Rspack/SWC to recompile a modern or local package
...Meteor.compileWithRspack(['grubba-rpc']),
// ES5 target for one dep
...Meteor.compileWithRspack(['zod'], { jsc: { target: 'es5' } }),
// Mark deps as externals so Meteor/Node load them at runtime
...(Meteor.isServer ? Meteor.compileWithMeteor(['sharp']) : {}),
}));
```
Use `compileWithMeteor` for:
- Native or binary deps (e.g. `sharp`).
- Atmosphere-package internals.
- `thread-stream` and similar worker-loading dependencies reached through
logging stacks such as `pino`. Fix
`Cannot find module '/_build/main-dev/lib/worker.js'` by adding
`thread-stream` to `compileWithMeteor`.
### `splitVendorChunk`
Splits `node_modules` into a stable `vendor` chunk to avoid duplicating
shared deps across async chunks.
```javascript
module.exports = defineConfig(Meteor => ({
...Meteor.splitVendorChunk(),
}));
```
For finer control, drop the helper and use Rspack's official
`splitChunksPlugin` config.
### `persistDevFiles` (Meteor 3.4.1+)
Rspack dev server keeps build output in memory. If Meteor's web server has
to serve a file (e.g. a Workbox-generated `sw.js`), persist it.
```javascript
// every rebuild
...Meteor.persistDevFiles(['manifest.json'])
// or split strategies
...Meteor.persistDevFiles({
once: ['sw.js'], // first build only; rewriting re-registers SW
always: ['manifest.json'],
})
```
Matchers: strings (`endsWith`), RegExp, or functions. HTML files persist
unconditionally.
| Strategy | When |
|----------|---------------------------------------|
| `always` | every build. Default for array form. |
| `once` | first build only. Use for service workers and any file whose rewrite would cascade a full reload. |
### `setCache`
```javascript
...Meteor.setCache(false) // disable
...Meteor.setCache('memory') // in-memory only
// default: persistent
```
Disable only when investigating Rspack cache bugs or OOM. Persistent is
the rebuild-speed default.
On `@meteorjs/rspack@2.2.0` (Meteor 3.5.2), a TypeScript config and its
resolvable relative local imports participate in persistent-cache dependency
tracking. Literal static imports, `import('./local')`, re-exports, and
`require('./local')` are detected. This does not promise tracking of computed
paths, arbitrary aliases, or modules outside the app. Older integrations may
miss TypeScript dependencies; upgrade before retaining a cache workaround.
If a config edit appears stale, inspect the resolved config/import paths and
rebuild first. Clear only a confirmed stale Rspack cache; use the recovery flow
in `migrate-to-rspack` instead of disabling caching permanently.
### `disablePlugins`
Match by constructor name string, RegExp, or predicate.
```javascript
...Meteor.disablePlugins([
'DefinePlugin',
/Html/i,
p => p?.constructor?.name === 'CustomConsoleLogPlugin',
])
```
### `enablePortableBuild` (Meteor 3.4.1+)
Default: `Meteor.isDevelopment` and `Meteor.isProduction` are replaced at
build time, enabling dead-code elimination of dev-only blocks.
```javascript
...Meteor.enablePortableBuild()
```
Keeps both as runtime checks. Bundle gets larger; dev/prod branches both
ship. Use only when one bundle must run in both environments without
rebuilding.
`Meteor.isClient`, `Meteor.isServer`, `Meteor.isTest` are always replaced
at build time regardless of this flag.
## Custom `HtmlRspackPlugin`
Replace or extend the default plugin to inject `<meta>` tags, CSP, etc.
```javascript
module.exports = defineConfig(Meteor => ({
plugins: [
Meteor.HtmlRspackPlugin({
meta: {
viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no',
'theme-color': '#4285f4',
},
}),
],
}));
```
A `client/main.html` (or whatever the entry folder uses) still applies
customizations through Meteor's HTML pipeline.
## Dev server port
`rspack.config.js`'s `devServer.port` is reserved. Use the env var:
```bash
RSPACK_DEVSERVER_PORT=3232 meteor run
```
Meteor manages the Rspack dev server so it can coordinate with Meteor's
own server; the port must be passed through env so both processes agree.
## Logging knobs
```javascript
module.exports = defineConfig(Meteor => ({
stats: 'detailed',
infrastructureLogging: { level: 'info' },
}));
```
`stats` controls bundle info per compilation. `infrastructureLogging.level`
controls HMR verbosity in terminal and browser; off by default.
To see the final config Meteor produces, enable
`"meteor": { "modern": { "verbose": true } }` in `package.json`.
## Reserved config keys
Rspack `entry` and `output` are owned by the integration. Overriding them
triggers warnings. Everything else is fair game.
## Reserved build folders
Do not edit:
- `_build/*`: Rspack entry, intermediate app, overridden Meteor entry.
- `public/build-assets/*`, `private/build-assets/*`: built static assets.
- `public/build-chunks/*`: dynamic-import code splits.
Meteor 3.5.2 adds `-test` and `-app-test` asset/chunk contexts; a
`METEOR_LOCAL_DIR` basename can also suffix contexts. Include actual generated
variants in external formatter, linter, test, and IDE ignores. Keep the active
build handoff visible to Meteor itself.
Auto-added to `.gitignore`. To rename, set in `package.json`:
```json
{
"meteor": {
"buildContext": "build",
"assetsContext": "assets",
"chunksContext": "chunks"
}
}
```
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/modern-build-stack/rspack-bundler-integration.md
@@ -0,0 +1,74 @@
# Scaffolds and service workers
Choose framework, workspace layout and offline requirements separately.
Inspect the app's release, resolved packages, lockfile and existing worker.
Enabling `meteor.modern` or adding Rspack does not itself make an app a PWA.
## Choose a starting point
These starters are documented for `3.6-beta.0`. Check the selected release's
[CLI documentation](https://docs.meteor.com/cli/#meteorcreate) and generated
files rather than treating this as an exhaustive compatibility matrix.
| Need | Starting point | Follow-through |
|---|---|---|
| React or React/TypeScript | `--react` (default), `--typescript` | `meteor-react`; see CLI docs for Tailwind, Chakra UI and Apollo variants. |
| Blaze | `--blaze` | `meteor-blaze` |
| Other frameworks | `--vue`, `--svelte`, `--solid`, or the documented alternative | Preserve the chosen framework; inspect its entries and loaders. |
| pnpm workspace | Meteor 3.6+: `--pnpm` | [Workspace ownership](meteor-3.6-workspaces.md); app at `apps/app`, shared packages under `packages/`. |
| New Blaze PWA | Meteor 3.6+: `--pwa` | `meteor-blaze`, `references/pwa-scaffold.md`: dependency-free worker, manifest, offline page. |
| Existing app | Keep the app and worker | `migrate-to-rspack` when changing bundlers or upgrading Rspack 1 to 2. |
Starter flags are not composable feature switches. `--pnpm` does not add
offline support; `--pwa` is not a React/workspace modifier. Smaller starters
such as `--minimal` may omit Rspack. `meteor create --list` lists examples,
not skeleton flags. Never scaffold over an existing app.
Meteor 3.5.2 and earlier do not have these new `--pnpm`/`--pwa` starters.
Keep existing/manual workspace and worker setups when the release must stay
pinned; pnpm and PWA support themselves are not exclusive to 3.6.
## Framework-neutral PWA build setup
Workbox and app-owned workers are framework-neutral. Preserve a working
implementation and verify the installed plugin's Rspack compatibility.
For Meteor 3.4.1+ with `@meteorjs/rspack` v2 or a later release-paired
integration, follow Meteor's
[service-worker guidance](https://docs.meteor.com/about/modern-build-stack/rspack-bundler-integration#service-worker)
for client-only `GenerateSW`, runtime caching of app bundles and network-only
HMR updates. Adapt asset/chunk matching and caching to the app.
For a custom generated worker filename, use
[`persistDevFiles`](rspack-config.md#persistdevfiles-meteor-341) with the
`once` strategy; default `sw.js` is already handled. Rewriting workers on each
rebuild can defeat HMR. Production output is written normally. On Meteor
3.4.0/v1, retain tested direct configuration; do not install another integration
major just to obtain the helper.
Check HTTPS/localhost, registration, manifest URLs and the `ROOT_URL` prefix.
Do not cache HMR/DDP traffic or private responses indiscriminately; clean up
only owned caches. A root `/sw.js` can use narrower scope `/portal/`; broader
than the script directory requires `Service-Worker-Allowed`. See the browser
[scope rules](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register#scope)
before moving a worker or rewriting a working scaffold's prefix.
## Notes Offline: two separate offline layers
[Notes Offline at the reviewed examples PR #50 revision](https://github.com/meteor/examples/tree/a7f001d3479a6f9088c80fe1016829385e74bfda/notes-offline)
uses React and Workbox for worker/asset caching, plus `jam:offline` and
`jam:method` for data persistence and replay. It is an example, not a universal
cache configuration or an automatically added Meteor 3.6 capability.
Use `meteor-community-packages` and its `references/offline.md` for
selective persistence, replay and logout cleanup. A worker does not provide
those data semantics; IndexedDB alone does not load the shell offline.
Validate development/HMR and the production build under the real URL prefix:
offline reload, uncached routes/chunks, worker/app updates, reconnection and
account changes. Test data replay separately. Startup is not offline evidence.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/index.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/modern-build-stack/rspack-bundler-integration.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/community-packages/offline.md
@@ -0,0 +1,186 @@
---
name: meteor-mongo-minimongo
description: >
Use when authoring or debugging Mongo queries in Meteor 3. Triggers on
Mongo.Collection, find/findOne, server async vs client Minimongo sync,
oplog vs change streams, indexes, selectors, modifiers, projections.
Use this skill when the user asks about Mongo on the server or asks about
Minimongo on the client.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: data
tagline: "Write and debug Mongo queries in Meteor 3 (server async vs Minimongo, oplog vs change streams, indexes, selectors, modifiers)."
bundle: ["essentials", "fullstack"]
docs_synced_at: "2026-09-08"
license: MIT
---
# Mongo and Minimongo
Meteor ships two implementations of the Mongo API in one codebase. The server
talks to MongoDB through an async driver. The client runs Minimongo, an
in-memory synchronous Mongo emulator that holds the documents that
subscriptions have shipped.
## Decision flow
1. Where does this code run?
- Server-only: use `await Collection.*Async(...)`.
- Client-only: use `Collection.*(...)` synchronously.
- Isomorphic (`import` in shared code): use `await Collection.*Async(...)`.
On the client the work is local but still Promise-based; on the server it
talks to Mongo.
2. Does the query select more than a page of documents? Add `{ limit, skip }`
and an index that matches the selector.
3. Are you reading from a publication on the client? Use `find().fetch()`
(sync) without `await`. The data is already local.
## Server reads
```javascript
const doc = await Posts.findOneAsync(id);
const list = await Posts.find({ ownerId }, {
fields: { title: 1 }, sort: { createdAt: -1 }, limit: 50,
}).fetchAsync();
const count = await Posts.find({ ownerId }).countAsync();
```
## Server writes
```javascript
const _id = await Posts.insertAsync({ title, ownerId });
await Posts.updateAsync({ _id }, { $set: { title } });
await Posts.removeAsync({ _id });
```
## Client reads (Minimongo)
The async API is isomorphic. Prefer it in shared code so the same line works
on the server.
```javascript
const doc = await Posts.findOneAsync(id); // works in shared/client/server
const list = await Posts.find({ ownerId }).fetchAsync();
```
On the client, the operation reads in-memory Minimongo but the async API still
returns a real Promise. Code after `await` resumes in a later microtask. The
sync API also works client-side, but only there:
```javascript
const doc = Posts.findOne(id); // client-only
const list = Posts.find({ ownerId }).fetch(); // client-only
```
Pick sync when the calling scope is naturally sync and forcing `await`
would cascade async into a render path. Common cases:
- React render functions and hooks that consume reactive data.
- Blaze template helpers.
- Tracker autoruns.
Pick async (`findOneAsync`, `fetchAsync`) when the file might also run on
the server, or the containing function is already `async`.
## Indexes
Indexes are server-side. Create them on app startup:
```javascript
import { Meteor } from "meteor/meteor";
import { Posts } from "/imports/api/posts";
Meteor.startup(async () => {
await Posts.createIndexAsync({ ownerId: 1, createdAt: -1 });
await Posts.createIndexAsync({ slug: 1 }, { unique: true });
});
```
Choose compound-index key order from equality filters, sort fields, range
filters, and usable index prefixes. The JavaScript property order in an
equality selector does not have to match the index. Verify the chosen plan in
the Mongo shell (`meteor mongo`) with
`db.posts.find(...).explain("executionStats")`.
## Reactivity source: oplog or change streams
The core driver boundary is release-specific:
| Meteor | Reactive behavior |
|---|---|
| 3.0 through 3.4 | Uses oplog when `MONGO_OPLOG_URL` is configured; otherwise polling. Core change streams and reactivity-order settings are unavailable. |
| 3.5+ | Chooses a driver per query in the default order below. |
Meteor 3.5+ defaults to:
```text
changeStreams -> oplog -> polling
```
Change streams require MongoDB 6+ on a replica set or sharded cluster, an
unordered observer, no `skip` or `limit`, and a selector Minimongo can compile.
An ineligible query falls through to the next configured driver. Oplog is
available only when `MONGO_OPLOG_URL` is configured.
On Meteor 3.5+, override the app-wide order with
`METEOR_REACTIVITY_ORDER=oplog,polling` or:
```json
{
"packages": {
"mongo": {
"reactivity": ["oplog", "polling"]
}
}
}
```
On Meteor 3.5+, the `disable-oplog` package removes only the oplog step. It
does not disable change streams. Use `reactivity: ["polling"]` to force
polling. On Meteor 3.0 through 3.4, do not add these settings; upgrade first.
For duplicate observer events or intermittent login disconnects under core
change streams, check the resolved `mongo` version before rewriting queries or
disabling reactivity. `mongo@2.5.1` (Meteor 3.5.2) fixes replay of events already
covered by a causal primary snapshot. Earlier 3.5 packages lack that fix;
upgrade and rerun the failing sequence. This does not change driver eligibility
or justify dropping arbitrary application events by timestamp. Capture observer
ordering if the problem persists; use `meteor-debugging` for an unknown cause.
## Collation (Meteor 3.5+)
Use `collation` for locale-aware or case-insensitive selectors and sorting on
both Mongo and Minimongo. Back the server query with an index created using
the same collation:
```javascript
const collation = { locale: "en", strength: 2 };
const users = await Users.find(
{ email: "Alice@Example.COM" },
{ collation },
).fetchAsync();
await Users.createIndexAsync({ email: 1 }, { collation });
```
Minimongo supports `locale`, strength 1 through 3, `caseLevel`,
`numericOrdering`, and `caseFirst`. Other Mongo collation options are
server-only and are ignored by Minimongo.
## Anti-patterns
- Use sync Mongo on the server. Removed in Meteor 3.
- Use sync Mongo (`findOne`, `insert`, `update`, `remove`) in shared code.
Breaks the moment the file is imported on the server.
- Unbounded `find` on the server. Always `limit`.
- Forget `fields` projection when publishing. Always project.
- Assume the async Minimongo API resumes inline. It returns a Promise even
though the underlying read is local.
## See also
- `references/server-vs-client.md`
- `references/selectors-modifiers.md`
- `references/eval-cases.md`
@@ -0,0 +1,102 @@
# Evaluation cases for `meteor-mongo-minimongo`
## Case 1: server-side find rewrite
Prompt: "This used to work in Meteor 2 on the server:
```
const post = Posts.findOne({ slug });
```
Now it returns undefined. Fix it."
Pass if the agent rewrites to `await Posts.findOneAsync({ slug })` and marks
the caller async.
## Case 2: missing index
Prompt: "My `Posts.find({ ownerId, archived: false }, { sort: { createdAt:
-1 } })` query is slow. Suggest an index."
Pass if the agent suggests `{ ownerId: 1, archived: 1, createdAt: -1 }` (or
calls out that `archived` could be omitted if filtering is rare).
## Case 3: Minimongo on client
Prompt: "My component is client-only. Which Mongo API should I use:
`Posts.findOne(id)` or `await Posts.findOneAsync(id)`?"
Pass if the agent says both work on the client and picks based on the
calling scope:
- Async (`findOneAsync`) when the file might ever be imported in
shared/server code, or the containing function is already async.
- Sync (`findOne`) when the scope is naturally sync (React render, Blaze
helper, Tracker computation) and forcing `await` would cascade an async
migration through the component tree for no real gain.
The sync API exists for exactly that case; using it deliberately is not a
mistake. Fail if the agent claims that an async Minimongo Promise resolves
inline or synchronously; only the underlying data access is local.
## Case 4: leaking columns
Prompt: "My subscription includes the `passwordHash` field. I never wanted
that to reach the client. What did I do wrong?"
Pass if the agent identifies missing `fields` projection in the publication
and proposes a `fields: { title: 1, ... }` allow-list.
## Case 5: Meteor 3.5 reactivity driver
Prompt: "After upgrading to Meteor 3.5, is oplog still the default for every
reactive Mongo query? How can I force the old order?"
Pass if the agent gives the default `changeStreams`, `oplog`, `polling` order,
lists the main change-stream eligibility requirements, and uses either
`METEOR_REACTIVITY_ORDER=oplog,polling` or the equivalent
`packages.mongo.reactivity` setting. It must not claim that `disable-oplog`
also disables change streams.
## Case 6: case-insensitive email lookup
Prompt: "On Meteor 3.5, query email addresses case-insensitively on both the
client and server without lowercasing stored values."
Pass if the agent uses `{ collation: { locale: "en", strength: 2 } }` on the
query and creates the server index with the same collation. It should mention
that only a subset of Mongo collation options is supported by Minimongo.
## Case 7: change streams requested before Meteor 3.5
Prompt: "My app is fixed on Meteor 3.4.1 and uses Atlas. Configure core
`changeStreams,oplog,polling` reactivity with `METEOR_REACTIVITY_ORDER`."
Pass if the agent says core change streams and reactivity-order configuration
begin in Meteor 3.5, explains that 3.4.1 uses oplog only with
`MONGO_OPLOG_URL` and otherwise polling, and requires an upgrade before using
the requested core driver. Fail if it assumes Atlas implies core change-stream
support on every Meteor 3 release.
## Case 8: selector property order and compound index
Prompt: "My index is `{ ownerId: 1, archived: 1, createdAt: -1 }`, but the
query object is `{ archived: false, ownerId }`. Must I reorder its JavaScript
properties before Mongo can use the index?"
Pass if the agent says equality selector property order need not mirror the
compound index, checks index prefixes and equality-sort-range behavior, and
uses `explain('executionStats')` to verify the plan. Fail if it treats object
property order as an index-eligibility rule.
## Case 9: change-stream replay during login
Prompt: "On Meteor 3.5.1, observer traces show an event already represented by
the initial primary snapshot replaying and triggering intermittent login
disconnects. Should I drop old events in application code or force polling?"
Pass if the agent checks the `mongo@2.5.1` fix shipped with 3.5.2, proposes a
compatible upgrade and reruns the reproduction before a permanent workaround.
It preserves driver eligibility/fallback rules and does not claim every
disconnect has this cause. Fail if it drops arbitrary events by timestamp or
disables change streams without evaluating the release fix.
@@ -0,0 +1,43 @@
# Selectors, modifiers, sort and field specifiers
## Selectors
```javascript
{ ownerId: userId } // equality
{ qty: { $gt: 0 } } // operators
{ tags: { $in: ["a", "b"] } }
{ $or: [{ qty: 0 }, { archived: true }] }
{ "address.city": "Berlin" } // dotted path
```
## Modifiers
```javascript
{ $set: { title } }
{ $inc: { qty: 1 } }
{ $push: { tags: "new" } }
{ $addToSet: { tags: "new" } }
{ $pull: { tags: "old" } }
{ $unset: { archived: 1 } }
```
## Sort specifiers
```javascript
{ sort: { createdAt: -1 } }
{ sort: [["score", "desc"], ["createdAt", "asc"]] }
```
## Field specifiers
Always project. Returning a whole document leaks columns.
```javascript
{ fields: { title: 1, qty: 1 } } // include only these
{ fields: { secretToken: 0 } } // exclude this; everything else included
```
Mixing `1`s and `0`s in one specifier is invalid except for `_id`.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/collections.md#selectors
@@ -0,0 +1,22 @@
# Server Mongo vs client Minimongo
| Aspect | Server (Mongo, async) | Client (Minimongo, sync) |
|--------------------|-----------------------------------|---------------------------------|
| Read one | `await c.findOneAsync(id)` | `c.findOne(id)` |
| Read many | `await c.find(q).fetchAsync()` | `c.find(q).fetch()` |
| Count | `await c.find(q).countAsync()` | `c.find(q).count()` |
| Insert | `await c.insertAsync(d)` | `c.insert(d)` (inside stub only)|
| Update | `await c.updateAsync(q, m)` | `c.update(q, m)` (stub only) |
| Remove | `await c.removeAsync(q)` | `c.remove(q)` (stub only) |
| Index | `await c.createIndexAsync(...)` | not applicable |
Isomorphic code runs on both sides. Use the async API throughout; on the
client the lookup is local but remains Promise-based, so code after `await`
resumes in a later microtask.
To explain a query, use the Mongo shell (`meteor mongo`) and run
`db.<collection>.find(...).explain("executionStats")`. Meteor does not
expose a `Cursor#explain` on the collection API.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/collections.md
+87
View File
@@ -0,0 +1,87 @@
---
name: meteor-native
description: >
Use when building or maintaining Meteor 3 Android/iOS apps through Cordova.
Triggers on meteor add-platform, android-device, ios-device, mobile-config.js,
Cordova plugins, native signing or store artifacts, and mobile hot code push
compatibility. Use this skill when the task already concerns Meteor's
Cordova app workflow; use meteor-debugging for an unexplained cross-layer
failure and meteor-deployment for the backend. React Native/Expo, Capacitor,
and native Node.js addons are separate workflows.
metadata:
author: meteor
kind: workflow
meteor: ">=3.0"
area: build
tagline: "Build and maintain Meteor 3 Cordova apps for Android and iOS, including plugins, native artifacts, and hot code push."
docs_synced_at: "2026-09-08"
license: MIT
---
# Meteor native apps
Turn the existing Meteor application into a reproducible Cordova build and
verify the requested device or distribution behavior. Meteor manages the web
bundle, Cordova project and platform versions; Android Studio and Xcode provide
native debugging, signing and distribution tools.
## Choose the workflow
1. Read `.meteor/release`, `.meteor/platforms`, `.meteor/cordova-plugins`,
`.meteor/versions`, `package.json`, and `mobile-config.js` when present.
Record host OS, target device/platform, installed native binary version,
and whether the task needs a development run, web update, or new binary.
2. Match prerequisites to the selected Meteor release and resolved Cordova
platform. Meteor 3.5.2 uses `cordova-lib@13.0.0`,
`cordova-android@15.1.0`, and `cordova-ios@7.1.1`; earlier releases have
different pins. Do not select the newest standalone Cordova platform
merely because it is available.
3. Choose the relevant reference below. Keep durable changes in the app's
platform/plugin declarations, configuration and assets; inspect generated
native output to verify what Meteor actually produced.
4. Rebuild/reinstall when native plugins, platform versions, permissions or
native configuration change. HCP can update compatible web code/assets;
it cannot supply missing native code or change installed binary metadata.
5. Verify on the target emulator/device or inspect the requested artifact.
Record command, versions, endpoint and observable result. A successful web
build alone does not validate a native app or a signed store artifact.
| Task | Read |
|---|---|
| Set up Android/iOS, add/remove platforms, run a device, choose WebView compatibility | [Toolchain and development](references/toolchain-and-development.md) |
| Change app metadata/assets, native preferences, access rules, plugins, permissions or build overrides | [Configuration and plugins](references/configuration-and-plugins.md) |
| Build Android artifacts or an iOS project, configure signing and prepare distribution | [Build and distribution](references/build-and-distribution.md) |
| Repair mobile update delivery, compatibility rejection, download or reload behavior | [Hot code push](references/hot-code-push.md) |
## Persistent state and runtime boundaries
- `.meteor/local/cordova-build/` is generated by default. If
`METEOR_LOCAL_DIR` is set, resolve the actual local directory before opening
or clearing its `cordova-build` child. Do not erase the whole local state
or local Mongo database to repair a Cordova cache.
- `mobile-config.js` is a build-time configuration file, not an application
module. `App.configurePlugin` supplies installation variables; it neither
installs a plugin nor runs its JavaScript API.
- Call native plugin APIs from client code guarded by `Meteor.isCordova`,
inside `Meteor.startup` or after equivalent device readiness. Meteor's
Cordova startup waits for `deviceready`; browser/server code must retain a
suitable fallback. Startup does not grant OS permissions automatically.
- A physical device's `localhost` is the device. Match `--mobile-server`
during development and `meteor build --server` for distribution to a
reachable endpoint. The embedded WebView's local content server is separate
from the Meteor backend and DDP connection.
## Neighboring workflows
| Request | Owner |
|---|---|
| Unknown crash, stuck data, or failure not yet isolated to native behavior | `meteor-debugging`, then return with the confirmed native boundary |
| Host the backend, configure Galaxy/Docker, deploy server changes, preserve the HCP client bundle | `meteor-deployment` |
| Rspack/SWC/module graph or a native npm addon such as `sharp` | `meteor-modern-build-stack` or `migrate-to-rspack` |
| OAuth provider/login behavior | `meteor-accounts`; use this skill for required Cordova plugin or native configuration |
| Explicit React Native/Expo or Capacitor app | Keep the chosen stack; this skill does not implement those integrations |
## Acceptance
Use [evaluation cases](references/eval-cases.md) to check native decisions,
earlier-release behavior, and neighboring-skill routing.
@@ -0,0 +1,88 @@
# Build and distribution
## Choose the native output and backend
Confirm the added platforms, host OS, app identity/version, installed native
platforms/plugins, production endpoint and intended distribution channel.
Use an output directory outside the app source and inspect existing contents
before choosing a location that the build may replace.
```bash
meteor build ../build-output --server=https://app.example.com
```
Native builds require an explicit `--server` when building an added native
platform. Do not rely on the CLI documentation's localhost default. Match the
URL to the deployed backend's public `ROOT_URL` and account for any explicitly
separate DDP URL. A build-time `DDP_DEFAULT_CONNECTION_URL` overrides the
native DDP endpoint; changing a server environment value later does not by
itself prove that installed clients received a new embedded configuration.
Use `--mobile-settings path/to/mobile-settings.json` when the native build
needs settings. Its `public` values initialize the mobile client; configuration
code can also read build-time `App.settings`. Inspect values intentionally
copied into native configuration and keep server-only credentials out of
plugin variables or assets.
| Command choice | Outcome |
|---|---|
| Default `meteor build ... --server=...` | Build the added native platforms supported by the host, plus the server/web output |
| `--platforms=android` or `--platforms=ios` | Select an already-added native platform; does not install it or provide a missing host toolchain |
| `--packageType=bundle` | Android AAB output; the current default |
| `--packageType=apk` | Android APK output |
| `--server-only` | Skip native app artifacts; retain configured client targets for HCP, including `web.cordova` when applicable |
| `--architecture=...` | Select server bundle architecture; does not enable iOS builds on Linux or choose a phone CPU |
On a release where an option's meaning is uncertain, verify `meteor help
build` for that app's Meteor tool. Preserve the `web.cordova` target on the
backend serving installed clients; a platform-filtered browser build can
accidentally remove the HCP bundle. Use `meteor-deployment` for hosting and
backend rollout.
## Android signing and installation
For the example output path, open `../build-output/android/project/` in
Android Studio. Inspect the generated AAB/APK and build log rather than
assuming that the presence of a project directory proves a successful build
or signing step.
Use the app's existing signing identity and Android Studio's signed bundle/APK
workflow, or its established equivalent in CI. Check application ID, version
code/name, package type, signing certificate and intended backend. Keep
keystores/passwords out of tracked source and logs. A debug APK is not a
release artifact, and an AAB is not directly installed with `adb install`.
Test the appropriate APK or the distribution channel's installed build on the
target device. Reusing the existing app identity/signing setup matters for
updates to already installed applications.
## iOS archive and distribution
On macOS, open `../build-output/ios/project/` in Xcode, using its generated
`.xcworkspace` when present. Meteor produces the Xcode project; it does not
prove a signed IPA exists. Configure the existing bundle identifier, team,
signing/provisioning and build/version values, choose the intended archive
destination, then archive and export/distribute through Xcode or the project's
established CI process.
Verify the resulting archive/export and device installation. A Linux build
can skip iOS with a warning while other outputs succeed; report that as
missing iOS validation, not a completed mobile release.
## Release verification
Check cold launch, target-device plugin/permission behavior, backend/DDP
connection, and a compatible web update for each intended platform. Native
configuration and plugin changes need a newly built and distributed binary;
keep older installed clients compatible with the backend during rollout.
Record the artifact actually produced, whether it is signed and installed,
and any unexecuted steps. Verify current Apple/Google submission requirements
at upload time. Building, signing and uploading are distinct actions; prepare
only the distribution steps requested by the user, using existing credentials
and release processes where available.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/cordova.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/index.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/environment-variables.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/app.md
@@ -0,0 +1,174 @@
# Configuration and plugins
## Keep configuration in application sources
`mobile-config.js` belongs at the Meteor app root and executes during the
native build. It is not imported by application startup. Preserve the app's
existing identity and platform-specific configuration when changing one field.
```js
// mobile-config.js
App.info({
id: 'com.example.myapp',
name: 'My App',
version: '1.0.0'
});
App.setPreference('Orientation', 'portrait', 'android');
```
For `BackgroundColor`, use a supported `#` hex value, for example
`App.setPreference('BackgroundColor', '#ffffffff')` for opaque white. Old
examples using `0x...` caused Android build failures during Meteor 3 migrations.
Check the failing resource/preference before treating nearby Gradle deprecation
warnings as the cause. Preserve the intended color and the target platform's
channel ordering. See the [confirmed 3.3.2 repair](https://forums.meteor.com/t/solved-migration-from-2-16-to-3-3-2-break-cordova-android-build/64274/2)
and the current [configuration example](https://docs.meteor.com/api/app).
| Need | App-level source | Check after generation |
|---|---|---|
| ID, display name, version | `App.info` | Native application ID and displayed/build versions; preserve published IDs |
| Platform preference | `App.setPreference(name, value, platform)` | Correct platform section; supported preference for the pinned platform/plugin |
| Icons and splash images | `App.icons`, `App.launchScreens` with project-relative assets | Accepted keys, existing source images, generated resources on target devices |
| Plugin installation variables | `App.configurePlugin(id, variables)` | Exact installed plugin ID and generated native configuration |
| Extra XML / platform resources | `App.appendToConfig`, `App.addResourceFile(src, target, platform)` | Correct generated XML/resource target, without replacing unrelated configuration |
| Native files outside those APIs | App-root `cordova-build-override/`, mirroring the generated Cordova project tree | Narrow override remains compatible with the selected native platform |
Meteor copies build overrides into the generated Cordova project. Prefer the
configuration APIs for values they own; a whole generated `config.xml`, Gradle
file, or project copy can mask future Meteor/platform changes. Rebuild and
inspect output after changing native configuration. Do not treat edits under
`.meteor/local/cordova-build` as the permanent source.
`App.settings` reads the build's settings file, while native client runtime
settings use its `public` subtree. A private settings value becomes exposed
if the build copies it into plugin variables, XML or client assets. Use
client-appropriate identifiers in native config and keep server credentials
on the server; do not log full settings while checking values.
## Network access, navigation, and OS policy
Choose the rule for the requested operation:
```js
// mobile-config.js
App.accessRule('https://api.example.com');
App.accessRule('https://docs.example.com', { type: 'navigation' });
App.accessRule('myapp:*', { type: 'intent' });
```
The default rule type is network access; navigation allows the WebView to move
to a URL; intent permits asking the OS to open it. An intent rule does not
register an inbound deep-link handler. Native allow rules do not configure the
remote server's CORS policy, disable CSP, grant runtime device permissions, or
repair invalid TLS certificates. Inspect the failing layer before widening
access, and keep rules scoped to the required destinations.
For local Android HTTP development, first verify the `--mobile-server` URL.
If logs show cleartext rejection, enable the development endpoint through a
development-specific network-security configuration or the documented
`App.appendToConfig` manifest edit below:
```js
App.appendToConfig(`<edit-config file="app/src/main/AndroidManifest.xml"
mode="merge" target="/manifest/application"
xmlns:android="http://schemas.android.com/apk/res/android">
<application android:usesCleartextTraffic="true" />
</edit-config>`);
```
That example is an application-wide cleartext allowance, not a per-domain
rule. Use it only in the local development build configuration; verify the
release output excludes it and uses the intended HTTPS service. Do not add
wildcard access or a production TLS bypass as an HCP fix.
## Install, configure, and call plugins
Use Meteor's plugin declarations. Replace the identifiers/versions below with
the selected plugin's verified npm ID and compatible exact version:
```text
meteor add cordova:PLUGIN_ID@EXACT_VERSION
meteor remove cordova:PLUGIN_ID
```
Review `.meteor/cordova-plugins` and the generated installed plugin list.
Atmosphere packages can also declare Cordova dependencies; inspect those
requirements if a removed plugin returns or a version is resolved differently.
`meteor npm install` alone does not register a Cordova plugin, and
`App.configurePlugin` only supplies its build-time variables. Consult the
selected plugin's own docs for variables, supported platform versions,
permission declarations, and runtime permission requests.
On Meteor 3.0.x, a plugin's `<dependency>` can trigger lost generated
dependencies and `Cannot find module 'cordova-android'`. The complete tool fix
ships in Meteor 3.1; 3.0.4's initial fix was incomplete. If the app must remain
on an affected release, identify the actual transitive plugin in `plugin.xml`
and declare its compatible exact version through `meteor add cordova:...`.
For the reported `cordova-plugin-screen-orientation@3.0.4` case, that dependency
was `es6-promise-plugin@4.2.2`. Do not add it to unrelated apps or permanently
edit generated `package.json`. On fixed releases, diagnose the installed
dependency graph before applying this historical workaround.
[Resolution and workaround](https://github.com/meteor/meteor/issues/13303),
[complete fix](https://github.com/meteor/meteor/pull/13416).
Native APIs belong in client code after device readiness:
```js
import { Meteor } from 'meteor/meteor';
Meteor.startup(() => {
if (!Meteor.isCordova) return;
// Use the installed plugin's documented API and permission flow here.
});
```
Do not infer readiness from a timer or make browser/server startup depend on
a Cordova global. Meteor's startup guard waits for `deviceready`, not for every
plugin-specific asynchronous operation or permission grant.
If changed plugin variables are not reflected, inspect the generated config
and installed plugin first. Stop the affected build process, preserve native
logs and any untracked IDE work, then remove only the actual generated
`cordova-build` directory if stale native state is confirmed. Re-run the
Meteor build/run command. Never substitute `meteor reset --db` or deletion of
all `.meteor/local` for this recovery.
## Local plugin development
Meteor supports `cordova:PLUGIN_ID@file://...` specifications. Quote the entire
argument when paths contain shell-significant characters. Meteor 3.5.2 fixes
resolution of encoded absolute file URLs and preserves existing raw paths
with reserved characters; verify the intended directory, `plugin.xml` ID and
generated plugin source before rebuilding. Use a real file-URL encoder for an
absolute path, not repeated manual decoding.
Earlier releases can mishandle those paths. If the app must stay pinned, use
a straightforward local path without reserved characters or an independently
verified compatible fix. Local source edits require another `meteor run` or
`meteor build` and a native reinstall as appropriate. Local filesystem paths
also need to resolve in every developer/CI environment; they are not portable
published plugin versions.
## Native launch and status UI
`meteor add mobile-experience` pulls in `mobile-status-bar` and `launch-screen`
defaults. It has no JavaScript API of its own. Configure appearance with the
documented App preferences/assets for the installed plugin/platform; check
actual device behavior when Android system-bar or splash rules change.
To hold the splash for app readiness, use `LaunchScreen.hold()` in native
client code before the normal release point, then call that handle's
`release()` once the intended UI is ready. Release every acquired handle,
including a deliberate error/fallback path; do not wait forever for an
unavailable network resource. Guard native use with `Meteor.isCordova` rather
than promising a browser implementation. A rendered web page is not evidence
that the native launch screen was released.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/app.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/tutorials/application-structure/index.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/autoupdate.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/troubleshooting/hot-code-push.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/mobile-experience.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/launch-screen.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/mobile-status-bar.md
@@ -0,0 +1,307 @@
# Evaluation cases for `meteor-native`
Run each prompt in a fresh conversation or disposable project. Keep these
criteria hidden until the run finishes; record observable outcomes separately.
## Case 1: Android setup
Prompt: "Add Android development to our Meteor 3.5.2 app on Linux. We have JDK 17
and SDK 35 installed, but no Android platform in .meteor/platforms yet."
Pass if the agent checks the app release and adds Android through Meteor, installs
SDK Platform 36 and Build Tools 36.0.0 for the 3.5.2 baseline, verifies host paths
and prerequisites, and proposes an emulator/device check. Fail if SDK 35 is
treated as sufficient or a web build is claimed to validate Android.
## Case 2: earlier toolchain boundary
Prompt: "Our Meteor 3.5.1 Android branch must stay pinned. Can we copy all 3.5.2
native prerequisites and run cordova platform add android@latest?"
Pass if the agent preserves Meteor 3.5.1, inspects its platform pins and
requirements, and uses Meteor platform commands. Fail if it forces 3.5.2
prerequisites or installs the newest standalone Cordova platform.
## Case 3: physical device endpoint
Prompt: "Our Meteor 3.5.2 Android app works in the emulator. On my USB phone, it
starts but cannot connect. The native build uses http://localhost:3000;
DDP_DEFAULT_CONNECTION_URL was also set during the last build."
Pass if the agent distinguishes device localhost from the host, chooses a
reachable LAN endpoint, inspects the embedded DDP override, and verifies the
regenerated native configuration. Fail if it uses the standard emulator address as
a universal physical-device fix.
## Case 4: iOS build host
Prompt: "Our Meteor app has Android and iOS platforms. Linux CI reports build
success but produced no IPA. Can --architecture=os.osx.arm64 create it here?"
Pass if the agent explains that iOS archives require macOS and Xcode and
distinguishes server architecture from the native build host. Fail if it claims
Linux success proves an IPA exists or that --architecture supplies Xcode.
## Case 5: persistent native configuration
Prompt: "Update our existing Meteor Cordova app's display name, splash and Android
orientation. Keep its published app ID. My edits to generated config.xml disappear
whenever Meteor rebuilds."
Pass if the agent edits app-root mobile-config.js and source assets, preserves the
published ID, and verifies the regenerated native output. Fail if it makes durable
changes only in generated config.xml.
## Case 6: plugin installation and readiness
Prompt: "I added App.configurePlugin for our chosen camera plugin and called its
API at module top level. It is undefined on the phone and breaks web and server
startup. This code is shared by all clients."
Pass if the agent distinguishes plugin declaration, build-time variables, client
runtime and permission flow. It uses Meteor.isCordova with Meteor.startup or
equivalent readiness and retains browser/server behavior. Fail if configuration
alone installs a plugin or a timer replaces readiness.
## Case 7: narrow generated-state repair
Prompt: "We changed a Cordova plugin's install variables, but the generated config
still has the old values. METEOR_LOCAL_DIR=.meteor/native-local and our local
Mongo data matters. Should we delete .meteor/local and try again?"
Pass if the agent resolves .meteor/native-local/cordova-build, first verifies
stale plugin state, and preserves logs and IDE changes before narrowly
regenerating it. Fail if it deletes all local state, uses meteor reset --db, or
targets the default directory despite METEOR_LOCAL_DIR.
## Case 8: local plugin paths
Prompt: "A local Cordova plugin lives in a directory containing spaces, # and %.
We have an encoded file URL and a raw legacy path. How should we add it on Meteor
3.5.2, and what about our pinned 3.5.1 maintenance branch?"
Pass if the agent verifies plugin identity and path encoding, explains the 3.5.2
fix, and keeps the pinned earlier branch on a simple compatible path or verified
fix. Fail if it repeatedly decodes a raw path, passes an unquoted shell-sensitive
path, or promises local source changes ship without rebuilding.
## Case 9: network policy layers
Prompt: "Our Cordova client needs an HTTPS API, an embedded docs page and an
external custom-scheme link. Local Android HCP also logs cleartext denied. Should
we use App.accessRule('*') and disable certificate checks everywhere?"
Pass if the agent distinguishes access, navigation and intent rules from CORS,
CSP, runtime permissions and TLS. Any broad Android cleartext allowance is limited
to development and verified absent from release output. Fail if it uses wildcard
rules or disables certificate checks as a production repair.
## Case 10: HCP native incompatibility
Prompt: "The server deploy adds a native plugin that installed clients don't have.
Devices say the Cordova platform/plugin versions are incompatible. Can we force
AUTOUPDATE_VERSION so everyone gets the new feature immediately?"
Pass if the agent requires a new binary for the missing native plugin, preserves
backend compatibility during rollout, and rejects a blind version override. Fail
if AUTOUPDATE_VERSION is presented as delivering missing native code.
## Case 11: HCP switch and CSS behavior
Prompt: "Our Meteor Cordova app receives a new HCP version and downloads it, but
our custom window.location.reload() still loads old code. CSS-only deploys reload
too. How do we diagnose this?"
Pass if the agent checks pending-bundle selection before custom reload, describes
Cordova CSS updates as full client reloads, and treats custom
WebAppLocalServer/Reload hooks as version-sensitive. Fail if a plain
window.location.reload is assumed to activate a pending bundle or browser CSS HMR
is promised on native production.
## Case 12: native release artifacts
Prompt: "Prepare release builds for our Meteor 3.5.2 Android/iOS app on a Mac,
using https://app.example.com. We need an Android AAB and an iOS archive for
review, with the existing signing identities. Do not upload yet."
Pass if the agent selects the requested endpoint, inspects the Android AAB and
Xcode archive with existing app/signing identities, and distinguishes generated
projects, signing, device installation and upload. Fail if it claims artifacts or
signing were executed without evidence, installs an AAB with adb install, or
uploads without authorization.
## Case 13: settings exposure
Prompt: "Can mobile-config.js read a value from our mobile settings file to
configure a plugin? The same file has a server API secret and public app settings;
I want to put the server secret into App.configurePlugin."
Pass if the agent distinguishes build-time App.settings from public client
settings and keeps the server secret out of plugin variables, XML and assets. Fail
if a private key is considered secret after embedding in the native app.
## Case 14: modern output and OS compatibility
Prompt: "Did Cordova's default bundle become modern in Meteor 3.3.2 or 3.4? We
also support a pinned 3.3.1 branch. Will meteor.modern.cordova=false let our 3.5.2
Android app run below cordova-android's minimum supported OS?"
Pass if the agent identifies the 3.3.2 capability/opt-out floor, retains the
earlier legacy branch, and notes that affected default configuration must be
verified rather than promising all 3.3.2+ tools emit modern output. It
distinguishes JavaScript compatibility from the native platform minimum OS. Fail
if a legacy bundle is claimed to restore unsupported device OS versions.
## Case 15: splash readiness
Prompt: "Our React-based Meteor Cordova app uses mobile-experience. We hold the
splash until data arrives, but it stays visible offline. Can I import a mobile-
experience API and just wait ten seconds?"
Pass if the agent treats mobile-experience as a package bundle and uses balanced
LaunchScreen.hold/release behavior, including an offline fallback. Fail if it
invents a mobile-experience API or hides missing readiness with a fixed delay.
## Case 16: platform removal
Prompt: "We are dropping iOS from this Meteor app but retaining Android and the
web app. How do we stop Meteor generating the iOS project without losing our
shared plugins or application data?"
Pass if the agent removes only iOS with meteor remove-platform ios and reviews
platform declarations. Fail if it removes shared plugins, Android, the web app or
local data without a separate reason.
## Case 17: neighboring stack exclusions
Prompt: "Two separate tasks: our Expo React Native app consumes a Meteor backend,
and sharp fails in the Meteor server's Docker build. Should either task start by
adding Meteor's Cordova Android platform?"
Pass if the agent preserves the Expo stack and routes the server addon/container
failure to build or deployment guidance. Fail if it adds Cordova to either
project.
## Case 18: stale HCP manifest
Prompt: "Our Meteor 3.2.2 iOS app updates locally but stays on the old client
behind NGINX in production. Android updates. DDP announces the new version, but
the public /__cordova/manifest.json GET has an old version and a cache hit; the
origin GET has the new version. Plugins are unchanged. Fix the update path."
Pass if the agent diagnoses manifest caching, bypasses caching and purges stale
content only for the affected manifest route through the deployment workflow,
preserves hashed-asset caching, and verifies the next version reaches iOS. Fail if
it changes compatibility hashes, TLS policy or native plugins, or disables caching
for every asset.
## Case 19: fresh manifest with plugin mismatch
Prompt: "Our Meteor 3.5.2 iOS client downloads a fresh /__cordova/manifest.json,
whose version matches the origin. Logs reject the update because it adds a plugin
missing from installed clients. Should we apply the NGINX no-cache workaround?"
Pass if the agent rules out stale-manifest caching from the evidence and selects
compatible binary rollout. Fail if it repeats the caching workaround or forces HCP
past the native mismatch.
## Case 20: background color migration
Prompt: "Our Meteor 3.3.2 Android build fails while processing resources. mobile-
config.js has App.setPreference('BackgroundColor', '0xff0000ff'). There is also a
Gradle property-syntax deprecation warning. Should we change Gradle versions?"
Pass if the agent checks the invalid preference as the concrete cause, uses a
supported # hex value while preserving the intended color, and verifies generated
resources/build output. Fail if it blindly changes Gradle or copies an ambiguous
color-name assertion from a forum.
## Case 21: transitive plugin on pinned 3.0.4
Prompt: "Our Meteor 3.0.4 branch must stay pinned this week. Android meteor build
started failing with Cannot find module cordova-android after adding cordova-
plugin-screen-orientation@3.0.4. Its plugin.xml declares es6-promise-plugin@4.2.2,
but the generated dependencies disappear. What durable workaround fits?"
Pass if the agent recognizes the incomplete 3.0.4 fix, keeps the release
constraint, and explicitly declares only the verified transitive plugin through
Meteor. It names 3.1 as the complete tool fix and verifies the next build. Fail if
it edits generated package.json permanently, installs an unrelated global Cordova,
or claims 3.0.4 already fixed it.
## Case 22: plugin failure after the tool fix
Prompt: "A Meteor 3.5.2 Android build cannot find a custom plugin module. The
generated Cordova dependencies are present and that plugin has no es6-promise-
plugin dependency. Should we add es6-promise-plugin@4.2.2 because a closed Meteor
issue says it fixes missing modules?"
Pass if the agent rejects the historical workaround for this evidence and examines
the actual plugin declaration, compatibility and generated source. Fail if it adds
the old dependency or treats every missing-module error as issue 13303.
## Case 23: misleading core-js error
Prompt: "Our Meteor 3.0.4 Cordova app starts in the browser but shows a white
screen after adding accounts-base on Android and iOS. The first exception comes
from url/legacy.js and says core-js is missing. Installing core-js in the app did
not help. .meteor/versions has url@1.3.4. How do we repair it?"
Pass if the agent identifies the URLSearchParams integration fix in url@1.3.5
shipped with Meteor 3.1, checks compatible package/release selection and
overrides, and verifies accounts startup. Fail if it removes accounts, repeatedly
installs app-level core-js, or diagnoses every white screen identically.
## Case 24: runtime iterators versus modern output
Prompt: "Our Meteor 3.4 Vue Cordova app emits modern JavaScript, but Vue Router
and another library fail with Map.entries is not a function or its return value is
not iterable. .meteor/versions has ecmascript-runtime-client@0.12.3. The same
WebView works when browsing the server URL. Should we downgrade Vue or set
modern.cordova=true?"
Pass if the agent distinguishes runtime constructor replacement from
transpilation, inspects the loaded polyfills, and selects the compatible
ecmascript-runtime-client@0.13.0 fix shipped in 3.4.1. Fail if it considers modern
output alone sufficient or blindly downgrades Vue.
## Case 25: runtime fix with a release constraint
Prompt: "Our Meteor 3.2.2 maintenance branch must stay pinned. A Cordova-only
Map.entries failure matches the ecmascript-runtime-client fix, and someone
suggests editing ~/.meteor/packages or copying the whole devel packages folder.
What is the smallest supportable approach?"
Pass if the agent preserves the release constraint, verifies whether the fixed
runtime package can be used compatibly, or scopes a verified app-local backport of
the relevant fix. It tests the supported native and browser clients. Fail if it
forces a release upgrade, edits the global cache or imports unrelated packages.
## Case 26: native Rspack proxy failure
Prompt: "Meteor 3.4 with Atmosphere rspack@1.0.0 works in normal web development.
meteor run android-device produces SockJS Invalid frame header errors in both
Android and a desktop browser attached to that run. The same deployment proxy
works in normal mode. What should we check and change?"
Pass if the agent matches the native run-mode proxy defect, identifies the fixed
Atmosphere rspack@1.1.0 integration shipped in 3.4.1, and verifies compatible
package/release selection plus both clients. Fail if it only changes production
proxy settings, treats Map errors as the same cause, or promises native Rspack
HMR.
## Case 27: absent modern config on older tools
Prompt: "Our Meteor 3.5 Cordova app has no meteor.modern field and METEOR_MODERN
is unset. The generated web.cordova bundle is still legacy. We want modern Cordova
output without changing other build options; another branch intentionally uses
modern.cordova=false. A thread says 3.5 fixed the default."
Pass if the agent distinguishes the 3.3.2 capability from the defaulting defect
fixed in 3.5.1, verifies actual output, and suggests a narrow explicit cordova
setting on the pinned tool or a fixed release. It preserves other options and the
intentional legacy branch, accounting for object-form configuration inheriting
enabled defaults. Fail if it treats the reporter statement as proof for 3.5, sets
every modern feature true, removes the legacy opt-out, or requires a new binary
solely for changing JavaScript output with unchanged native compatibility and
supported WebViews.
@@ -0,0 +1,73 @@
# Native hot code push
## Decide whether the update can use HCP
HCP replaces compatible web code/assets in the installed Cordova shell. It
does not install new native plugins, upgrade Cordova platforms, or alter
native permissions, app identity, icons or signing. A Meteor upgrade can
change the native compatibility contract; do not assume every installed
binary can accept its client bundle.
Compare generated native changes, not merely edited filenames or the Meteor
release label. The compatibility hash covers platform/plugin versions; it does
not capture every native permission or configuration change. Those changes
still need a new binary even when the hash is unchanged.
When a change needs native code/configuration, rebuild and distribute a new
binary and preserve backend compatibility for old installations. Do not make
`AUTOUPDATE_VERSION` or another compatibility override the default way to
silence a platform/plugin mismatch. Such an override needs a verified native
and JavaScript API contract across the installed client population.
## Find the failed stage
Inspect `.meteor/versions` for HCP packages (`hot-code-push`, `autoupdate`,
`reload`) and the native webapp plugin; minimal/custom apps may omit them.
The default `meteor-base` setup supplies HCP. Compare an installed native
build with its intended server, not just with a successful browser reload.
| Stage | Evidence and next decision |
|---|---|
| Backend produced the update | Verify the deployed `web.cordova` bundle and changed version. A `--server-only` deployment can serve HCP; a build excluding that client target cannot. |
| Device reached the server | Check the embedded build URL, `--mobile-server` for local work, public `ROOT_URL`, and any DDP override. Distinguish network/TLS/cleartext failures from compatibility. |
| Client learned the version | Inspect DDP subscription/device logs and changed version hashes. A fixed `AUTOUPDATE_VERSION` must be changed when intentionally delivering another update. |
| Client fetched the current manifest | Compare the version in `/__cordova/manifest.json` through the public proxy/CDN and directly at the origin. Inspect GET response headers and cache hits. If the public manifest is stale, bypass caching for this endpoint and purge its stale copy; keep versioned asset caching separate. |
| Native shell accepted it | Read compatibility rejection logs. A platform/plugin mismatch calls for the native-version comparison and binary rollout above. |
| Assets downloaded | Check the failing URL, response, connectivity and device storage. Large `public/` files can block update downloads; relocate only confirmed problem assets as the app requires. |
| Pending version became active | Verify download completion, pending-version selection and reload. Custom reload code can reload the old bundle if it bypasses the native switch. |
| New client started | Capture the first startup failure or rollback on the device. A version notification or download alone does not prove successful startup. |
An iOS-only production failure can be a cached manifest even when development
and Android update correctly. A [Meteor 3.2.2 reporter confirmed this repair](https://forums.meteor.com/t/cordova-ios-hot-push-code/63707/6).
Meteor marks its manifest non-cacheable; a proxy must preserve that behavior.
Verify a subsequent deployment changes the public manifest version and reaches
the device. A fresh manifest with a real plugin mismatch still requires the
compatibility decision above. Use `meteor-deployment` for the proxy change.
Use selected version values and stage transitions for diagnostics. Never log
full runtime settings, session credentials or private payloads to inspect HCP.
Collect native logs through Android Studio/Xcode and WebView debugging when
needed; use `meteor-debugging` if the failure still spans unknown layers.
## Reload behavior
Cordova HCP reloads the whole client even for CSS-only changes. Browser CSS
refresh and development HMR are different paths; do not promise state-preserving
CSS HMR in a production native app merely because a browser supports it.
Prefer the built-in reload path. When an app already customizes reloads,
inspect that code against its resolved Meteor/reload/webapp-plugin versions:
the native pending bundle must be selected before a forced page reload. The
docs describe `WebAppLocalServer.switchToPendingVersion` and the retry callback
of `Reload._onMigrate`; these are version-sensitive integration hooks, not a
reason to add custom reloader code to every app. Preserve unsaved-state handling
and remove temporary instrumentation after reproducing the repair.
For local HTTP failures, see
[configuration and plugins](configuration-and-plugins.md). A development-only
network exception is not a production compatibility or TLS repair.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/troubleshooting/hot-code-push.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/autoupdate.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/cordova.md
@@ -0,0 +1,172 @@
# Toolchain and development
## Resolve versions before installation
Read the app release and existing platform declarations. Meteor pins Cordova
platforms independently of its Cordova library version. Use Meteor commands
at the app root; a global `cordova` executable is not the authority for the
Meteor-generated project.
Meteor 3.5.2 uses `cordova-lib@13.0.0`; verify Meteor's bundled Cordova tooling
alongside its platform pins when diagnosing a toolchain mismatch.
| Target | Meteor 3.5.2 baseline | Verification |
|---|---|---|
| Android | `cordova-android@15.1.0`, JDK 17, SDK Platform 36, Build Tools 36.0.0, Android command-line tools; Gradle available for project setup | `java -version`, `gradle --version`, SDK Manager, actual generated Gradle/platform output |
| iOS | `cordova-ios@7.1.1`; macOS with Xcode, command-line tools, accepted Xcode license and CocoaPods | `xcode-select -p`, `xcodebuild -version`, `pod --version`, selected simulator/device and signing team |
On earlier Meteor releases, inspect that release's native platform pins and
the corresponding Cordova requirements. For example, a branch pinned to
Meteor 3.5.1 does not acquire 3.5.2's SDK 36 requirement. Preserve a requested
release constraint. A platform upgrade may also raise minimum device OS
support; JavaScript transpilation cannot reverse that change.
For the 3.5.2 Android baseline, install missing SDK components with SDK Manager
or:
```bash
sdkmanager 'platforms;android-36' 'build-tools;36.0.0'
```
Resolve `JAVA_HOME` and `ANDROID_HOME` to the actual host installations;
`ANDROID_SDK_ROOT`, if set, must agree. Add the required command-line tools,
platform-tools and emulator directories to PATH. Do not copy a macOS SDK path
onto Linux or Windows. Keep the generated project's compatible Gradle wrapper
and Android Gradle Plugin pairing rather than accepting an unrelated IDE
upgrade suggestion.
For iOS, a Linux/Windows build cannot produce the Xcode archive or signed IPA.
Use the project's macOS workstation or runner. Native platform requirements
and current store submission requirements are separate; check Apple's current
requirements when preparing an upload.
## Platform lifecycle
```bash
meteor list-platforms
meteor add-platform android
meteor run android
```
Use `meteor add-platform ios` and `meteor run ios` on macOS. The run targets
`android` and `ios` select an emulator/simulator; `android-device` and
`ios-device` select a physical-device workflow. Ensure the device is visible
and authorized in Android Studio/ADB or Xcode before blaming app startup.
To stop targeting a native platform, use `meteor remove-platform android` or
`meteor remove-platform ios` and review `.meteor/platforms`. Do not remove the
shared application or plugins still needed by another platform. Meteor
regenerates its native project from app-level state; running standalone
`cordova platform add/remove` inside generated output is not a durable
replacement for these declarations.
## Device networking and native IDEs
For the standard Android emulator, `10.0.2.2` reaches the host machine:
```bash
meteor run android --mobile-server=http://10.0.2.2:3000
```
For a physical device, use the development machine's reachable LAN address
and port, for example:
```bash
meteor run android-device --mobile-server=http://192.168.1.4:3000
```
Replace that address with the real endpoint. Verify network reachability,
server bind address/firewall, device authorization, and the URL embedded by the
current native build. A custom `DDP_DEFAULT_CONNECTION_URL` can override the
DDP endpoint independently; inspect it when HTTP and subscriptions disagree.
Do not change `--cordova-server-port` expecting it to repair the backend URL.
For cleartext rejection, use the scoped guidance in
[configuration and plugins](configuration-and-plugins.md).
Open the generated project for device logs and native diagnostics:
| Platform | Default development path |
|---|---|
| Android Studio | `.meteor/local/cordova-build/platforms/android/` |
| Xcode | `.meteor/local/cordova-build/platforms/ios/`; prefer the generated `.xcworkspace` when present |
Resolve custom local state first. Preserve useful IDE evidence, then express
durable native changes in `mobile-config.js` or the app's build overrides.
## WebView JavaScript compatibility
Meteor 3.3.2 introduced modern Cordova output with a legacy opt-out. Earlier
Meteor 3 releases used the legacy default. On 3.3.2+, an app that still needs
legacy JavaScript can merge this setting into its existing `package.json`:
```json
{
"meteor": {
"modern": { "cordova": false }
}
}
```
Preserve the other options' effective values; modern objects enable omitted
options, as detailed below. Test the actual supported WebView and
plugins; this setting neither restores OS support dropped by a native platform
nor creates separate modern/legacy Cordova binaries. Web-only development
architecture exclusions are a separate build concern: verify `web.cordova`
is produced when developing native apps or serving HCP.
Check the effective bundle rather than inferring it from the release alone.
Affected 3.3.2 through 3.5 tools can normalize an absent modern setting to
legacy; Meteor 3.5.1 fixes that defaulting defect. Inspect `METEOR_MODERN` and
`meteor.modern` overrides first. On an affected pinned release, explicitly set
`meteor.modern.cordova` to `true` when the supported WebViews allow modern
output, preserving the other effective settings. Objects inherit enabled
defaults, so `{ "cordova": true }` also enables omitted modern options. For an
affected app with no modern setting and no environment override, preserve its
otherwise disabled options with:
```json
{
"meteor": {
"modern": {
"transpiler": false,
"minifier": false,
"webArchOnly": false,
"watcher": false,
"cordova": true
}
}
}
```
Merge this into the existing `meteor` object. If the app already configures
modern options, preserve their effective values instead of copying those
four `false` values. Preserve a deliberate Cordova legacy requirement.
[Fix and regression coverage](https://github.com/meteor/meteor/pull/14411).
Changing only JavaScript output does not itself require a new native binary.
Verify the installed WebViews support that output and the native compatibility
hash is unchanged before using HCP; a release upgrade can separately change
platform/plugin pins. See [hot code push](hot-code-push.md).
## Version-specific startup failures
Match the first exception and resolved package before selecting a repair.
Inspect `.meteor/versions` and app-local `packages/` overrides; npm dependencies
and the Meteor release label alone do not identify the loaded Atmosphere code.
| Confirmed signature | Fixed package / release | Decision |
|---|---|---|
| Early Meteor 3 Cordova startup fails after adding accounts, with a misleading missing `core-js` error from `url/legacy.js` | `url@1.3.5`, shipped in Meteor 3.1 | Check for a shadowing `packages/url` override before choosing a compatible fixed package/release, then verify account startup. Adding app-level `core-js` or removing accounts does not repair the URLSearchParams integration. [Fix](https://github.com/meteor/meteor/pull/13459) |
| `Map.keys`, `Map.entries` or iteration fails in a modern library only in the Cordova bundle | `ecmascript-runtime-client@0.13.0`, shipped in Meteor 3.4.1 | Check whether legacy polyfills replaced native Map/Set/Symbol. Modern transpilation alone is not this fix. Use the compatible fixed package/release; for a constrained branch, verify an app-local backport against its supported WebViews. Do not edit the global Meteor cache or downgrade unrelated UI libraries. [Meteor 3 confirmation](https://forums.meteor.com/t/solved-vue3-does-not-work-with-cordova/61109/10) |
| Meteor 3.4 Rspack `android-device`/iOS development produces SockJS `Invalid frame header` or proxy errors, including in a desktop browser attached to that native run | Atmosphere `rspack@1.1.0`, shipped in Meteor 3.4.1 | Use the fixed native integration that skips the desktop HMR bootstrap/proxy. Confirm the native run-mode reproduction and resolved package; healthy fixed versions or production proxy failures need separate diagnosis. [Fix](https://github.com/meteor/meteor/pull/14226) |
On earlier constrained releases, verify package compatibility before a
selective update or backport. Retest both the native client and any affected
browser clients. Do not force a framework upgrade contrary to the app's
release constraint or apply these repairs to an unexplained white screen.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/cordova.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/index.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/cli/environment-variables.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/generators/changelog/versions/3.3.2.md
+153
View File
@@ -0,0 +1,153 @@
---
name: meteor-pubsub
description: >
Use when authoring or debugging Meteor publications and subscriptions
(Meteor.publish, Meteor.subscribe). Triggers on publication strategies
(SERVER_MERGE, NO_MERGE, NO_MERGE_NO_HISTORY), the low-level publish API
(added/changed/removed), cursor authorization, reactive joins, leaked
documents. Use this skill when the user asks about pub/sub or asks about
reactive data fetching.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: data
tagline: "Author and debug publications/subscriptions (publish strategies, low-level `added/changed/removed`, authorization, reactive joins)."
bundle: ["essentials", "fullstack"]
docs_synced_at: "2026-08-25"
license: MIT
---
# Meteor publications and subscriptions
Publications stream a set of documents to subscribed clients and keep them
live. The publication is the only place server-side authorization can
filter rows before they reach the client.
## Decision flow
1. Does the client need this data reactively? If no, prefer a method (one-shot
read). If yes, use a publication.
2. Is the data user-specific? Filter by `this.userId` inside the publish
function. Without that filter, documents leak across users.
3. Can the publication be expressed as a single cursor? Return it directly.
4. Does it need one async lookup before choosing a cursor? Use an async
publish handler, await the lookup, then return the cursor.
5. Does it need per-document async joins, custom aggregation output, or an
external reactive source? Drop to the low-level `this.added` /
`this.changed` / `this.removed` API.
## Scaffold
```javascript
import { Meteor } from "meteor/meteor";
import { Items } from "/imports/api/items";
Meteor.publish("items.mine", function () {
if (!this.userId) {
return this.ready();
}
return Items.find(
{ ownerId: this.userId },
{ fields: { title: 1, qty: 1, updatedAt: 1 }, sort: { updatedAt: -1 } },
);
});
```
Project `fields` whenever the collection contains columns the subscriber
must not receive.
Async publish handlers may also return a cursor:
```javascript
Meteor.publish("items.byTeam", async function (teamId) {
const member = await Memberships.findOneAsync({
teamId,
userId: this.userId,
});
if (!member) return this.ready();
return Items.find({ teamId }, { fields: { title: 1, qty: 1 } });
});
```
Meteor awaits the handler before processing the returned cursor.
## Subscribing
```javascript
import { Meteor } from "meteor/meteor";
const handle = Meteor.subscribe("items.mine");
// React / Blaze / Svelte hooks observe handle.ready() and the local cursor.
handle.stop();
```
## Publication strategies
Set per-collection with `Meteor.server.setPublicationStrategy`. Three options:
```javascript
import { DDPServer } from "meteor/ddp-server";
Meteor.server.setPublicationStrategy(
"items",
DDPServer.publicationStrategies.NO_MERGE,
);
```
| Strategy | When to use |
|----------------------|-----------------------------------------------------------------------------|
| `SERVER_MERGE` | Default. Tracks merged document fields across publications and sends deltas. |
| `NO_MERGE` | Tracks sent document IDs so unsubscribe can remove them. Use when the collection is owned by one publication. |
| `NO_MERGE_NO_HISTORY`| Remembers nothing and sends no removals on stop. Reserve for send-and-forget queues where stale client documents are intentional. |
See `references/publication-strategies.md`.
## Low-level publish API
For joins or async work:
```javascript
Meteor.publish("feed", async function () {
const cursor = Posts.find({}, { fields: { title: 1, authorId: 1 } });
const observer = await cursor.observeChangesAsync({
added: async (id, doc) => {
const author = await Users.findOneAsync(doc.authorId, {
fields: { username: 1 },
});
this.added("feed", id, { ...doc, authorName: author?.username });
},
changed: (id, changes) => this.changed("feed", id, changes),
removed: (id) => this.removed("feed", id),
});
this.ready();
this.onStop(() => observer.stop());
});
```
Note: cursor `transform` functions remain synchronous. Use a separate
publication or the low-level API for per-document async joins.
Live observer delivery does not wait for one async callback before later
changes arrive. If ordering or backpressure matters, serialize the work with a
per-subscription Promise queue. Attach an error policy and stop the observer
from `this.onStop`; see `references/low-level-publish-api.md`.
## Anti-patterns
- Publish without a `this.userId` filter when data is user-specific.
- Publish sensitive or unnecessary columns. Add a `fields` projection when
the full document is not part of the publication contract.
- Confuse an async publish handler with an async cursor transform. Meteor
awaits the handler Promise, but each transform callback must return a
document synchronously.
- Use cursor transforms for async joins. Transforms are synchronous; the
low-level API is the right tool.
- Subscribe to large unbounded collections. Page the data with `limit`/`skip`.
## See also
- `references/publication-strategies.md`
- `references/low-level-publish-api.md`
- `references/eval-cases.md`
@@ -0,0 +1,71 @@
# Evaluation cases for `meteor-pubsub`
## Case 1: missing auth filter
Prompt: "Why are documents from other users showing up in my client when I
subscribe to this publication?"
```javascript
Meteor.publish("items", function () {
return Items.find({});
});
```
Pass if the agent adds `this.userId` filtering and an `ownerId` selector.
## Case 2: async join
Prompt: "I want my feed publication to include the author username. The
cursor transform crashed with 'returned a Promise'."
Pass if the agent rewrites to the low-level publish API with
`observeChangesAsync`.
## Case 3: strategy choice
Prompt: "My server runs out of memory under load. I publish a real-time
activity feed to every user."
Pass if the agent chooses `NO_MERGE` only when the collection is owned by one
publication and explains that it tracks sent IDs for removals on unsubscribe.
It may choose `NO_MERGE_NO_HISTORY` only for a send-and-forget queue whose
consumer owns cleanup, and must warn that no removals are sent on stop. Fail if
it calls either strategy stateless without qualification.
## Case 4: unsubscribe
Prompt: "How do I stop the subscription when the user leaves the page?"
Pass if the agent stores the handle and calls `.stop()` in unmount/cleanup.
## Case 5: async handler returning a cursor
Prompt: "My publication awaits a membership lookup and then returns
`Items.find({ teamId })`. Does an async `Meteor.publish` handler require the
low-level API?"
Pass if the agent says Meteor awaits async publish handlers and accepts the
returned cursor. Fail if it rejects the handler only because it returns a
Promise. It may recommend the low-level API only for custom or per-document
async output.
## Case 6: ordered async join
Prompt: "My `observeChangesAsync` `added` callback awaits a user lookup. Under
bursty updates, later changes overtake earlier joins and rejected lookups only
appear in logs."
Pass if the agent explains that live delivery does not await each callback,
serializes dependent work with a per-subscription Promise queue, registers
observer teardown with `this.onStop`, and defines a terminal error policy such
as `this.error`. Fail if it assumes `async added()` alone provides
backpressure.
## Case 7: publication error lifecycle
Prompt: "Can I call `this.error(err)` to report a warning and keep the
subscription alive?"
Pass if the agent says `this.error` stops the subscription and sends the error
to the client. It should recommend a separate data or logging channel for a
non-fatal warning.
@@ -0,0 +1,73 @@
# Low-level publish API
When a publish function needs to join, transform asynchronously, or react to
external sources, return nothing and drive the publication imperatively.
## Methods on `this`
- `this.added(collectionName, id, fields)`: announce a document.
- `this.changed(collectionName, id, fields)`: update fields.
- `this.removed(collectionName, id)`: drop a document.
- `this.ready()`: signal initial population complete.
- `this.onStop(fn)`: register a teardown.
- `this.error(err)`: stop the subscription and send the error to the client.
- `this.stop()`: end the subscription.
- `this.userId`, `this.connection`: identity.
## Pattern
```javascript
Meteor.publish("feed", async function () {
const handle = await Posts.find().observeChangesAsync({
added: (id, doc) => this.added("posts", id, doc),
changed: (id, doc) => this.changed("posts", id, doc),
removed: (id) => this.removed("posts", id),
});
this.ready();
this.onStop(() => handle.stop());
});
```
Always pair `observeChangesAsync` with `onStop`. Leaks otherwise.
## Async callback ordering
Initial `added` callbacks can be awaited while the observer is attaching, but
live notifications do not wait for an async callback before scheduling later
changes. Returning a Promise gives Meteor a rejection to log; it does not add
live-event backpressure. Serialize dependent work yourself:
```javascript
Meteor.publish("feed", async function () {
let work = Promise.resolve();
const enqueue = (task) => {
work = work.then(task).catch((error) => this.error(error));
return work;
};
const handle = await Posts.find().observeChangesAsync({
added: (id, doc) => enqueue(async () => {
const author = await Users.findOneAsync(doc.authorId, {
fields: { username: 1 },
});
this.added("feed", id, { ...doc, authorName: author?.username });
}),
changed: (id, fields) => enqueue(async () => {
this.changed("feed", id, fields);
}),
removed: (id) => enqueue(async () => {
this.removed("feed", id);
}),
});
this.ready();
this.onStop(() => handle.stop());
});
```
Keep independent callbacks synchronous when no asynchronous join is needed.
If one queued task fails, `this.error` terminates the subscription instead of
leaving the client with partially joined data.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/meteor.md#publish-and-subscribe
@@ -0,0 +1,50 @@
# Publication strategies
## `SERVER_MERGE` (default)
The server maintains a per-client view of every published document and only
sends diffs. Highest memory cost; lowest bandwidth. Right for typical apps
where the working set per client is small.
## `NO_MERGE`
The server does not merge fields across publications, but it remembers the
document IDs sent by this subscription. It can therefore send removals when
the subscription stops. Client handling is forgiving: duplicate `added`
messages become changes, a `changed` for an unknown ID becomes an add, and a
`removed` for an unknown ID is ignored.
Use this when a collection is supplied by only one publication. It uses less
server state than `SERVER_MERGE`, but multiple publications for the same
collection can overwrite each other's document view.
## `NO_MERGE_NO_HISTORY`
The server remembers nothing about sent documents and does not send removals
when the subscription stops. Use only for special send-and-forget queues where
the consumer handles retention and stale client documents are intentional.
## Setting the strategy
Strategies are set per collection name, not per publication.
```javascript
import { DDPServer } from "meteor/ddp-server";
Meteor.server.setPublicationStrategy(
"feed",
DDPServer.publicationStrategies.NO_MERGE,
);
// Read it back
Meteor.server.getPublicationStrategy("feed");
```
## Choosing
- Default app (collaborative editor, dashboards): `SERVER_MERGE`.
- Collection owned by one publication, with unsubscribe cleanup: `NO_MERGE`.
- Send-and-forget queue with application-owned cleanup: `NO_MERGE_NO_HISTORY`.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/meteor.md#publication-strategies
+205
View File
@@ -0,0 +1,205 @@
---
name: meteor-security
description: >
Use when auditing or hardening a Meteor 3 application. Triggers on
missing check() on method arguments, missing this.userId guards on
publications, browser-policy CSP, DDPRateLimiter rules, oauth-encryption
via Accounts.config oauthSecretKey, audit-argument-checks, allow/deny
legacy patterns, BrowserPolicy.content.disallowInlineScripts,
BrowserPolicy.framing.disallow. Use this skill when the user asks about
hardening, asks about a security review, or asks about CSP for a
third-party script (Stripe, Google Maps, fonts).
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: security
tagline: "Audit and harden Meteor 3 apps (`check()` coverage, `this.userId` guards, browser-policy CSP, rate limits, oauth-encryption)."
bundle: ["essentials", "fullstack"]
docs_synced_at: "2026-08-25"
license: MIT
---
# Meteor security
Meteor's security model is opinionated: the server holds authority, the
client cannot be trusted, and the only places that filter data before it
reaches users are methods (write paths) and publications (read paths).
## Decision flow
1. Audit every method: does it `check()` every argument and guard on
`this.userId` or `Meteor.userId()` when authentication matters?
2. Audit every publication: does it filter by `this.userId` (when
user-specific) and project columns with `fields`?
3. Add `audit-argument-checks` in dev to catch missing `check()`.
4. Add `browser-policy` and configure CSP.
5. Add `DDPRateLimiter` rules for sensitive methods (login, password
reset, resource creation).
6. If the app uses OAuth, set `oauthSecretKey` to encrypt provider
secrets at rest.
7. Remove `allow` / `deny` rules. They are legacy and easy to misuse;
use methods instead.
## Method guard checklist
```javascript
import { Meteor } from "meteor/meteor";
import { check, Match } from "meteor/check";
Meteor.methods({
async updateProfile(payload) {
check(payload, { displayName: String, bio: Match.Optional(String) });
if (!this.userId) {
throw new Meteor.Error("not-authorized");
}
await Meteor.users.updateAsync(this.userId, { $set: { profile: payload } });
},
async updateAddress(payload) {
check(payload, String);
if (!Meteor.userId()) {
throw new Meteor.Error("not-authorized");
}
await Meteor.users.updateAsync(Meteor.userId(), { $set: { address: payload } });
},
});
```
Reject any method that does not match: `check` on every argument, userId
gate when needed, `Meteor.Error(code, reason)` for failures, `*Async`
Mongo on the server.
## Publication guard checklist
```javascript
Meteor.publish("items.mine", function () {
if (!this.userId) return this.ready();
return Items.find(
{ ownerId: this.userId },
{ fields: { title: 1, qty: 1 }, limit: 200 },
);
});
```
Reject any publication that returns an unbounded cursor, omits the field
projection, or skips a userId filter on user-specific data.
## CSP via `browser-policy`
```bash
meteor add browser-policy
```
```javascript
// server top-level or inside Meteor.startup
import { BrowserPolicy } from "meteor/browser-policy-common";
import { Meteor } from "meteor/meteor";
Meteor.startup(async () => {
await BrowserPolicy.content.disallowInlineScripts();
BrowserPolicy.content.disallowEval();
BrowserPolicy.framing.disallow();
});
```
`BrowserPolicy` is server-only. Configure it during module initialization or
startup so every request receives one deterministic process-wide policy. The
current implementation invalidates its cached CSP after a mutation, but do not
mutate this global policy per request or per user. See
`references/browser-policy-csp.md` for recipes (Stripe, Google Maps,
fonts, inline-style allowance).
## DDPRateLimiter for sensitive methods
```javascript
import { DDPRateLimiter } from "meteor/ddp-rate-limiter";
DDPRateLimiter.addRule(
{
type: "method",
name: "login",
clientAddress: () => true,
},
5,
60000, // 5 attempts per 60s, per IP
);
```
Only matcher fields contribute to the rate-limit bucket key. Without
`clientAddress`, `connectionId`, or `userId`, every matching caller shares one
global bucket. Meteor 3.5+ permits async matcher functions for database-backed
decisions; keep their queries fast because the connection waits for them. On
Meteor 3.0 through 3.4, matchers must stay synchronous. Use a fixed rule,
precomputed synchronous state, or upgrade rather than awaiting Mongo there.
The default rule (5 in 10s for login / signup / password reset) ships
with `accounts-base`. Remove with `Accounts.removeDefaultRateLimit()`
only if you replace it.
## OAuth secret encryption
Add `oauth-encryption` and pass a 16-byte base64 key (NOT 32 bytes) to
`Accounts.config` at module top level (not inside `Meteor.startup`):
```bash
meteor node -e "console.log(require('crypto').randomBytes(16).toString('base64'))"
```
```javascript
import { Accounts } from "meteor/accounts-base";
Accounts.config({
oauthSecretKey: Meteor.settings.oauthSecretKey,
});
```
At startup, `accounts-oauth` seals an unsealed provider application secret at
`ServiceConfiguration.configurations.secret`. Provider packages also seal
supported per-user token fields, such as `services.github.accessToken` or
Twitter's `accessTokenSecret`. There is no generic
`Meteor.users.services.<provider>.secret` field. Inspect the provider schema
before asserting which user credential is encrypted.
## `audit-argument-checks`
```bash
meteor add audit-argument-checks
```
Throws if any method or publication runs without `check()` covering
every argument. Methods that legitimately accept arbitrary input declare
this explicitly:
```javascript
Meteor.methods({
rawLog(...args) {
check(args, [Match.Any]);
// ...
},
});
```
## Anti-patterns
- `Collection.allow` / `Collection.deny` rules. Legacy; easy to combine
into a soft-fail. Replace with methods.
- `Meteor.settings.public.<secret>`. The client sees `public`. Move
secrets to the top level of `settings.json`.
- Publish the entire `Meteor.users` collection. Always project (e.g.
`fields: { username: 1, profile: 1 }`) and filter. Publish email only to
the owning user or another explicitly authorized audience.
- Use `BrowserPolicy.content.allowOriginForAll` for a third-party script. It
grants the origin to every current content directive. Allow only the script,
frame, connect, image, style, or font directives the integration needs.
- Methods that accept callback-shaped arguments. Functions cannot travel
over DDP.
- Call `Accounts.config({ oauthSecretKey })` inside `Meteor.startup`.
Must be at module top level so it loads before the OAuth packages
read it.
## See also
- `references/method-and-publish-guards.md`
- `references/browser-policy-csp.md`
- `references/eval-cases.md`
- Related skills: `meteor-methods`, `meteor-pubsub`, `meteor-accounts`.
@@ -0,0 +1,88 @@
# `browser-policy` CSP recipes
`BrowserPolicy` is server-only. Call its functions at module top level or
inside `Meteor.startup` so policy initialization is deterministic. The policy
is process-global, not request-specific. Current implementations invalidate
the cached CSP when it changes, but do not use runtime mutation for per-user or
per-route authorization.
## Install
```bash
meteor add browser-policy
```
Pulls in both `browser-policy-content` (CSP) and `browser-policy-framing`
(X-Frame-Options). Add either standalone for a smaller surface.
## Tight default
```javascript
import { BrowserPolicy } from "meteor/browser-policy-common";
await BrowserPolicy.content.disallowInlineScripts();
BrowserPolicy.content.disallowEval();
BrowserPolicy.framing.disallow();
```
`disallowInlineScripts`, `allowInlineScripts`, and `setPolicy` are async in
current Meteor. Await them from an async startup callback when startup order
matters.
Removes `eval`, inline `<script>` blocks, and embedding by other sites.
## Stripe Checkout / Elements
```javascript
BrowserPolicy.content.allowScriptOrigin("https://js.stripe.com");
BrowserPolicy.content.allowFrameOrigin("https://js.stripe.com");
BrowserPolicy.content.allowFrameOrigin("https://hooks.stripe.com");
BrowserPolicy.content.allowConnectOrigin("https://api.stripe.com");
```
Inspect CSP violation reports for the Stripe features actually enabled. Add a
new origin only to the directive named by the violation.
## Google Maps / Fonts / GTM
```javascript
BrowserPolicy.content.allowScriptOrigin("https://maps.googleapis.com");
BrowserPolicy.content.allowConnectOrigin("https://maps.googleapis.com");
BrowserPolicy.content.allowStyleOrigin("https://fonts.googleapis.com");
BrowserPolicy.content.allowFontOrigin("https://fonts.gstatic.com");
BrowserPolicy.content.allowScriptOrigin("https://www.googletagmanager.com");
```
Do not replace these calls with `allowOriginForAll`. That helper adds the
origin to every directive already in the policy, including resource types the
provider does not need.
## Inline styles (framework injects them)
```javascript
BrowserPolicy.content.allowInlineStyles();
```
Tradeoff: weakens style protection. Use only when the framework (e.g.
Material UI, styled-components) genuinely needs it.
## Frame-ancestors (Chrome / Safari)
`X-Frame-Options` is partly ignored by Chrome / Safari. To restrict
framing across browsers, use the CSP `frame-ancestors` directive:
```javascript
BrowserPolicy.content.allowFrameAncestorsOrigin("https://example.com");
```
## Reset
```javascript
await BrowserPolicy.content.setPolicy(...) // override entire content policy
BrowserPolicy.framing.allowAll() // unset X-Frame-Options
```
Used in tests where the default policy interferes.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/browser-policy.md
@@ -0,0 +1,110 @@
# Evaluation cases for `meteor-security`
## Case 1: missing `check()`
Prompt: "Audit this method:
```javascript
Meteor.methods({ async addItem(p) { await Items.insertAsync(p); } });
```
"
Pass if the agent flags missing `check()`, missing `this.userId` guard,
and rewrites with `check(p, { title: String, qty: Match.Integer })` plus
a userId gate.
## Case 2: leaky publication
Prompt: "What's wrong with this publication?
```javascript
Meteor.publish('items', function () { return Items.find({}); });
```
"
Pass if the agent flags missing `this.userId` filter, missing `fields`
projection, and missing `limit` on an unbounded cursor.
## Case 3: Stripe CSP
Prompt: "Add a CSP that lets Stripe Checkout load."
Pass if the agent uses `browser-policy`, calls
`BrowserPolicy.content.allowScriptOrigin("https://js.stripe.com")`, and
adds `BrowserPolicy.content.allowFrameOrigin("https://js.stripe.com")`
and `"https://hooks.stripe.com"`. It may add
`allowConnectOrigin("https://api.stripe.com")` when the integration needs it.
Fail if it uses `allowOriginForAll`.
## Case 4: OAuth secret in plaintext
Prompt: "My Google application secret in
`ServiceConfiguration.configurations.secret` is plaintext, and I also want
supported per-user OAuth tokens encrypted at rest."
Pass if the agent adds `oauth-encryption`, generates a 16-byte (not 32)
base64 key, and configures
`Accounts.config({ oauthSecretKey: Meteor.settings.oauthSecretKey })`
at module top level (not inside `Meteor.startup`). It must distinguish the
provider application secret from provider-specific user fields and reject a
generic `services.<provider>.secret` path.
## Case 5: allow/deny in legacy code
Prompt: "I have `Items.allow({ insert: () => true });` in my code. Is
that ok?"
Pass if the agent rejects allow/deny as a legacy pattern and rewrites the
mutation as a `Meteor.method` with `check()` + `this.userId` guard.
## Case 6: async publication authorization
Prompt: "Audit this publication. It awaits an organization membership check
and then returns a filtered cursor from an async publish handler."
Pass if the agent validates the authorization selector and projection while
accepting the async handler. Fail if it requires the low-level publish API
only because the handler returns a Promise.
## Case 7: per-IP limiter is accidentally global
Prompt: "I limited the `login` method with `{ type: 'method', name: 'login' }`,
but one client's failures block every user. I wanted five attempts per IP."
Pass if the agent explains that only matcher fields form the bucket key and
adds `clientAddress: () => true`. It should test two addresses with independent
counters. Fail if it changes only the numeric limit.
## Case 8: database-backed rate decision
Prompt: "On Meteor 3.5, apply a stricter method limit to free-tier users. The
tier is in `Meteor.users`."
Pass if the agent uses a projected `findOneAsync` inside an async `userId`
matcher, warns that it delays message processing on the connection, and
defines behavior for a rejected matcher Promise.
## Case 9: audit argument checks
Prompt: "How can I detect methods and publications that forgot to validate
all DDP arguments?"
Pass if the agent adds `audit-argument-checks`, validates every argument with
`check`, and uses `check(args, [Match.Any])` only when arbitrary arguments are
intentional. Fail if it treats the package as a replacement for authorization.
## Case 10: user directory email leak
Prompt: "Publish usernames and profiles for our member directory. Should I
include every member's `emails` field too?"
Pass if the agent defaults to `{ username: 1, profile: 1 }`, filters and limits
the directory, and includes email only for a concrete authorized requirement.
## Case 11: database-backed limiter before Meteor 3.5
Prompt: "On Meteor 3.4, make a DDP rate-limit matcher await a user plan lookup."
Pass if the agent says async matchers begin in Meteor 3.5, rejects the awaited
matcher on 3.4, and offers a synchronous fixed rule, precomputed state, or a
framework upgrade. Fail if it applies the current 3.5 API unconditionally.
@@ -0,0 +1,89 @@
# Method and publish guards
The two attack surfaces an agent must audit on every PR.
## Method checklist
For every `Meteor.methods({ ... })` entry:
- [ ] `check()` on every argument.
- [ ] `this.userId` guard when authentication is required.
- [ ] Role check when elevated privileges are required (e.g.
`alanning:roles`).
- [ ] `Meteor.Error(code, reason, details?)` thrown on failure; never a
plain `Error` (the client gets `"Internal server error"`).
- [ ] `*Async` Mongo on the server. Sync Mongo is removed in Meteor 3.
- [ ] `DDPRateLimiter.addRule` if the method is rate-sensitive (login,
password reset, resource creation, expensive queries).
```javascript
Meteor.methods({
async addItem(payload) {
check(payload, { title: String, qty: Match.Integer });
if (!this.userId) throw new Meteor.Error("not-authorized");
return await Items.insertAsync({
...payload,
ownerId: this.userId,
createdAt: new Date(),
});
},
});
```
## Publication checklist
For every `Meteor.publish(...)`:
- [ ] `this.userId` filter when data is user-specific.
- [ ] `fields` projection limiting columns.
- [ ] `limit` and `sort` on unbounded collections.
- [ ] An async publish handler may await authorization or setup work and
return a cursor. Cursor `transform` callbacks remain synchronous; use
the low-level API for per-document async output.
```javascript
Meteor.publish("items.mine", function () {
if (!this.userId) return this.ready();
return Items.find(
{ ownerId: this.userId },
{
fields: { title: 1, qty: 1, updatedAt: 1 },
sort: { updatedAt: -1 },
limit: 200,
},
);
});
```
## Sensitive-fields denylist
For `Meteor.users`:
```javascript
Meteor.publish("users.public", function () {
if (!this.userId) return this.ready();
return Meteor.users.find(
{},
{ fields: { username: 1, profile: 1 }, limit: 200 },
);
});
```
Never publish `services.*`. That subtree holds OAuth secrets, password
bcrypt hashes, and resume tokens. Do not publish every user's `emails` field by
default. Publish an email only to the owning user or to a narrowly selected,
explicitly authorized audience.
## Audit packages
```bash
meteor add audit-argument-checks
```
Crashes the request when a method or publish handler runs without
`check()` covering every argument. Dev-time signal; safe to leave on in
production too.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/tutorials/security/security.md
+238
View File
@@ -0,0 +1,238 @@
---
name: meteor-testing
description: >
Use when setting up, designing, writing, or repairing tests and test
harnesses in a Meteor 3 app. Triggers on
meteortesting:mocha, --driver-package, TEST_WATCH, TEST_BROWSER_DRIVER,
MOCHA_GREP, meteor.testModule, focused tests, .only,
Meteor.server.method_handlers, Meteor.server.publish_handlers,
DDP.connect, --full-app integration mode, sinon, async test signatures,
Playwright/Cypress E2E. Use this skill when the user asks about test
runners, asks about testing publications, or asks about Jest vs Mocha
in Meteor. For a failing, hanging, or flaky test whose failing layer or root
cause is unknown, use meteor-debugging before changing the test or app.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: testing
tagline: "Set up and write Meteor 3 tests (`meteortesting:mocha`, async signatures, methods/publications, Playwright/Cypress E2E)."
bundle: ["fullstack"]
docs_synced_at: "2026-09-11"
license: MIT
---
# Testing Meteor 3 apps
`meteortesting:mocha` is the canonical Meteor test driver. It boots the
app in test mode (no app code runs except the test files) and reports
results in the server console.
If an existing test fails, hangs, or flakes and the failing layer is unknown,
use `meteor-debugging` to isolate the cause. Return here when evidence points to
test setup, design, driver behavior, fixtures, or regression coverage.
## Decision flow
1. Unknown failure in an existing test? Use `meteor-debugging` to classify
application, data, harness, browser, environment, or shared-state causes.
2. Pure logic, no Meteor APIs? Plain Mocha or any test runner; nothing
Meteor-specific.
3. Method or publication? Integration test it with `meteortesting:mocha`
using `Meteor.server.method_handlers[name].apply(ctx, args)` or
`publish_handlers`.
4. Need to drive a real DDP client (cross-process or end-to-end DDP
semantics)? Use `--full-app` mode and `DDP.connect`.
5. UI flow / browser interaction? Start the normal app with deterministic
test settings and run Playwright or Cypress against it. Use
`meteor test --full-app` only when the browser flow must load app-test
modules.
## Setup
```bash
meteor add meteortesting:mocha
meteor npm install --save-dev @types/mocha
```
```json
// package.json
{
"scripts": {
"test": "TEST_WATCH=1 meteor test --driver-package meteortesting:mocha",
"test:ci": "meteor test --once --driver-package meteortesting:mocha",
"test:full": "meteor test --full-app --driver-package meteortesting:mocha"
}
}
```
Test-mode conventions:
- Normal test mode eagerly loads `*.test[s].*` and `*.spec[s].*` files, while
ordinary application code loads only when imported by a test.
- Filename discovery ignores `tests/` directories. A configured
`meteor.testModule` instead loads its explicit entry module and imports.
- `--full-app` eagerly loads the normal app plus `*.app-test[s].*` and
`*.app-spec[s].*` files, and sets `Meteor.isAppTest`.
For Meteor 3.5.2 Rspack full-app/TLA behavior, parent-`private` discovery
failures, and the jQuery harness regression fixed in Meteor 3.6-beta.0, read
[release-specific test setup](references/meteor-3.5.2-testing.md). Check
resolved packages and suite counts before applying a version-specific fix.
To focus an existing test, prefer a supported driver filter such as
`MOCHA_GREP` after checking the installed driver in `.meteor/versions`; use
`.only` only temporarily. These select registered tests but do not prevent
other test modules from evaluating. If loading itself causes interference,
inspect `meteor.testModule` and read `references/focused-runs.md` before
narrowing entrypoint imports. Restore every temporary focus or import change,
then run the normal affected suite. Read the configured entrypoint paths from
the project; do not invent paths, scripts, ports, or helpers.
## Method test (server-side)
```javascript
import assert from "node:assert/strict";
import { Meteor } from "meteor/meteor";
import { Items } from "/imports/api/items";
if (Meteor.isServer) {
describe("items.add", function () {
beforeEach(async function () {
await Items.removeAsync({});
});
it("inserts when authed", async function () {
const _id = await Meteor.server.method_handlers["items.add"].apply(
{ userId: "u1" },
[{ title: "x", qty: 1 }],
);
const doc = await Items.findOneAsync(_id);
assert.equal(doc.title, "x");
});
it("rejects when unauthed", async function () {
await assert.rejects(() =>
Meteor.server.method_handlers["items.add"].apply({ userId: null }, [{}]),
);
});
});
}
```
`.apply(context, argsArray)` is the documented form;
`Meteor.server.method_handlers[name]` is the registered method
implementation. Pass a stub `this` with `userId` (and `unblock`,
`connection`, etc. when needed).
## Publication test (server-side)
```javascript
if (Meteor.isServer) {
describe("items.mine publication", function () {
it("only ships the subscribing user's items", async function () {
await Items.removeAsync({});
await Items.insertAsync({ _id: "a", ownerId: "u1" });
await Items.insertAsync({ _id: "b", ownerId: "u2" });
const cursor = await Meteor.server.publish_handlers["items.mine"]
.apply({ userId: "u1" }, []);
const docs = await cursor.fetchAsync();
assert.deepEqual(docs.map((d) => d._id), ["a"]);
});
});
}
```
For publications using the low-level `this.added` / `this.changed` API,
test with a real DDP client via `--full-app` mode (next section).
Always await the direct publish handler. Conventional handlers return the
cursor immediately; async handlers return a Promise of the cursor.
## End-to-end DDP test (`--full-app` mode)
```javascript
import { DDP } from "meteor/ddp-client";
import { Mongo } from "meteor/mongo";
import { Tracker } from "meteor/tracker";
const conn = DDP.connect(Meteor.absoluteUrl());
const RemoteItems = new Mongo.Collection("items", { connection: conn });
function ready(sub) {
return new Promise((resolve) => {
const computation = Tracker.autorun((c) => {
if (sub.ready()) {
c.stop();
resolve();
}
});
});
}
const sub = conn.subscribe("items.mine");
await ready(sub);
const docs = RemoteItems.find().fetch();
```
Run with `meteor test --full-app --driver-package meteortesting:mocha`.
## Client unit test (Minimongo)
```javascript
if (Meteor.isClient) {
describe("Items minimongo", function () {
beforeEach(function () { Items.remove({}); });
it("filters by ownerId", function () {
Items.insert({ _id: "a", ownerId: "u1" });
Items.insert({ _id: "b", ownerId: "u2" });
assert.equal(Items.find({ ownerId: "u1" }).count(), 1);
});
});
}
```
Client tests run in the browser the driver spawns. With
`TEST_BROWSER_DRIVER=puppeteer`, the browser is headless Chromium and
results flow back to the server console.
Do not treat a server-only green run as complete client coverage. The driver
prints a message when no browser is connected; configure
`TEST_BROWSER_DRIVER` in CI and confirm client test counts are present.
## Browser E2E
Run Playwright or Cypress against the normal application unless the test
needs Meteor's app-test modules. The server command must work from a clean
clone with a tracked, nonsecret settings fixture or fully documented test
environment variables. Do not point it at an ignored developer settings file.
Cover at least one complete mutation flow and one rejected server action.
Basic page-title checks do not exercise async method stubs, authorization, or
publication readiness.
## Anti-patterns
- Reach for Jest. Jest does not understand Meteor's build system. Use
`meteortesting:mocha`.
- Mock Mongo. Run the real driver against a clean DB.
- Forget `if (Meteor.isServer) { ... }` guards. Server tests crash if
they run in the browser harness.
- Skip `beforeEach` cleanup. Tests leak state across runs.
- Catch and log a `beforeEach` failure without rethrowing. The test then runs
against unknown state and can report a misleading assertion.
- Assert only the database postcondition for a rejected method. Also require
the Promise to reject with the expected `Meteor.Error`.
- Replace `Meteor.userId` or another global without restoring it in
`afterEach`.
- Use `Meteor.call` with callbacks in async test code. Use
`Meteor.callAsync` or unwrap `method_handlers` directly.
## See also
- `references/mocha-setup.md`
- `references/focused-runs.md`
- `references/ddp-test-helpers.md`
- `references/eval-cases.md`
@@ -0,0 +1,88 @@
# DDP-based test helpers
`--full-app` mode runs the whole app alongside tests. A second DDP
connection lets you drive the app like a client would and inspect its
local state.
## Connect to the running app
```javascript
import { DDP } from "meteor/ddp-client";
const conn = DDP.connect(Meteor.absoluteUrl());
```
`conn` is a stand-alone DDP client. It has its own resume token, its own
collections, its own subscription handles.
Register each named collection against that connection before subscribing:
```javascript
import { Mongo } from "meteor/mongo";
const RemoteItems = new Mongo.Collection("items", { connection: conn });
```
## Wait for a subscription to be ready
```javascript
import { Tracker } from "meteor/tracker";
function ready(sub) {
return new Promise((resolve) => {
const computation = Tracker.autorun((c) => {
if (sub.ready()) {
c.stop();
resolve();
}
});
});
}
const sub = conn.subscribe("items.mine");
await ready(sub);
```
## Inspect the resulting documents
```javascript
const docs = RemoteItems.find().fetch();
```
Do not inspect `conn._stores`, `._docs`, or `conn.connection`. The first two
are private internals, and `DDP.connect` returns the connection directly, so
there is no nested `.connection`. A collection constructed with
`{ connection: conn }` is the supported local-cache interface.
## Method invocation on a separate connection
```javascript
await conn.callAsync("items.add", { title: "x", qty: 1 });
```
This goes over the wire, hits the real method handler, and the result is
the value the method resolved to.
## Disconnect
```javascript
conn.disconnect();
```
Call this in `after` / `afterEach` so the test process exits cleanly.
## When to use which
| Need | Use |
|-----------------------------------------|------------------------------------------------------------------|
| Test a method's logic | `Meteor.server.method_handlers[name].apply(ctx, args)` directly. |
| Test a publication's cursor | `Meteor.server.publish_handlers[name].apply({ userId }, [])`. |
| Test the full DDP path (auth, ratelimits, multi-user merge) | `DDP.connect(Meteor.absoluteUrl())` + `--full-app`. |
| Test client reactivity through DDP | `--full-app` + `DDP.connect` + Tracker autorun. |
Direct `method_handlers` / `publish_handlers` invocation is the fast
default. Reach for `--full-app` and `DDP.connect` only when the path
under test actually depends on the network round trip.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/tutorials/testing/testing.md
@@ -0,0 +1,190 @@
# Evaluation cases for `meteor-testing`
## Case 1: setup from zero
Prompt: "Set up Mocha tests for my Meteor 3 app."
Pass if the agent adds `meteortesting:mocha`, writes the `package.json`
scripts (with `--once` for CI and `TEST_WATCH=1` for dev), and shows a
`.test.js` example with `if (Meteor.isServer)` guards.
## Case 2: method handler test
Prompt: "Write a test for my `items.add` method."
Pass if the agent uses
`Meteor.server.method_handlers["items.add"].apply({ userId: "u1" }, [args])`
with a stubbed userId and awaits the Mongo result. Avoids
`Meteor.call`/`callAsync` from the test (which goes over the wire and
adds DDP overhead).
## Case 3: publication test
Prompt: "Test that my `items.mine` publication only ships items owned by
the subscribing user."
Pass if the agent uses
`await Meteor.server.publish_handlers["items.mine"].apply(
{ userId: "u1" }, [])`, calls `.fetchAsync()` on the resolved cursor, and
asserts on the returned `_id`s. The `await` is required so the test also
works when the publication handler is async.
## Case 4: --full-app DDP test
Prompt: "I need to test that an unauthed client cannot see my admin
publication's documents even over DDP."
Pass if the agent uses `meteor test --full-app`, then `DDP.connect` to a
second client and `subscribe` without logging in, and asserts on the
empty named collection created with
`new Mongo.Collection(name, { connection: conn })`. Fail if it reads
`conn.connection._stores`, `conn._stores`, or another private cache.
## Case 5: Jest detour
Prompt: "Can I use Jest instead of Mocha?"
Pass if the agent steers away from Jest, explains Meteor's build system
exposes a test-driver hook that Jest does not implement, and recommends
`meteortesting:mocha` (or any other Meteor test-driver package).
## Case 6: swallowed async setup failure
Prompt: "My `beforeEach` catches and logs `removeAsync` and `insertAsync`
errors, but later assertions fail with unexpected document counts."
Pass if the agent removes the catch or rethrows, requires setup to reject the
test, and isolates startup seeding from the test database.
## Case 7: negative method assertion
Prompt: "This authorization test only checks that the document count did not
change after `callAsync`. Is that enough?"
Pass if the agent also asserts that `callAsync` rejects with the expected
`Meteor.Error`, while retaining the postcondition as a second assertion.
## Case 8: client tests silently skipped
Prompt: "All server tests pass, but the runner says to load the app in a
browser. Can CI still be green?"
Pass if the agent says client tests were not executed, configures
`TEST_BROWSER_DRIVER`, and checks that client test results appear in CI.
## Case 9: Playwright clean-checkout server
Prompt: "Playwright's webServer uses `private/settings.dev.json`, which is
ignored and missing in CI. How should I validate the migration?"
Pass if the agent introduces a tracked nonsecret test fixture or explicit
environment setup, starts the normal app deterministically, and covers a
mutation plus a rejected action rather than only static page checks.
## Case 10: ignored tests directory
Prompt: "Why does `meteor test` ignore `tests/users.test.js`, and what filename
should I use for a full-app test?"
Pass if the agent explains that every `tests/` directory is ignored by the
Meteor build tool, moves a normal test to a non-ignored path matching
`*.test[s].*` or `*.spec[s].*`, and uses `*.app-test[s].*` or
`*.app-spec[s].*` for `--full-app`. Fail if it says the directory itself is a
discovery convention.
## Case 11: CI Node for Meteor 3.3
Prompt: "Configure the CI Node version for a Meteor 3.3 test job. Can it reuse
Node 20 from Meteor 3.0?"
Pass if the agent selects Node 22 for Meteor 3.3, explains that only Meteor 3.0
uses Node 20 while 3.1 through 3.4 use Node 22, and recommends `meteor node -v`
to verify the exact target. Fail if it treats all pre-3.4 releases as Node 20.
## Case 12: unexplained failing-test near miss
Prompt: "A full-app Meteor test hangs only in CI. I do not know whether the
problem is its DDP subscription, database cleanup, browser driver, or product
code. Rewrite the test to make it pass."
Pass if the agent routes first to `meteor-debugging` to preserve the failure,
compare local and CI evidence, and isolate the application, data, harness,
browser, environment, or shared-state boundary. It should return to
`meteor-testing` only after evidence identifies test setup, design, driver,
fixture, or regression work. Fail if it rewrites the test or raises timeouts
before classifying the failure.
## Case 13: focus one test through the Meteor driver
Prompt: "I use `meteortesting:mocha`. How can I repeatedly run only the
`items.add` unauthenticated case without changing which modules Meteor loads?"
Pass if the agent checks the installed driver version and uses `MOCHA_GREP`
with a quoted regular expression matching the full test title. It may offer
temporary `it.only`, but requires cleanup and an affected-suite run. Fail if it
invents an unsupported `meteor test --grep` flag, requires `.only` on every
ancestor, or edits the test module graph for ordinary execution focus.
## Case 14: focus test module loading
Prompt: "Our `meteor.testModule` entrypoints import every spec. `MOCHA_GREP`
focuses the assertion, but module-scope setup from unrelated imports still
runs. How can I isolate this safely?"
Pass if the agent distinguishes execution filtering from module loading and
temporarily narrows the configured entrypoint import graph only because
load-time behavior is the problem. It preserves and restores the imports,
removes focus markers, and runs the normal affected suite. Fail if it claims
the title filter prevents module evaluation, changes private runner internals,
or gives project-specific paths, ports, helpers, or scripts.
## Case 15: full-app tests with a server-only test entry
Prompt: "On Meteor 3.5.2 with its paired Rspack packages, mainModule has client
and server entries, testModule has only a server entry, and the server imports
a module with top-level await. How should full-app tests load this app?"
Pass if the agent keeps the configured application client/server bundles,
awaits the module initialization, and separates client bundle compilation from
client test execution. Fail if it removes the app client entry, adds a sleep,
or guarantees every detached Promise or async startup callback has settled.
## Case 16: zero full-app tests below a parent private path
Prompt: "A Meteor 3.5.1 Rspack app under /workspace/private/my-app runs zero
full-app tests; the same commit elsewhere discovers them. Should I remove all
private-directory exclusions?"
Pass if the agent checks the 3.5.2 eager-discovery fix and the app-relative test
patterns and entrypoints, proposes a paired upgrade or a disposable path
reproduction, and preserves the app's private-assets exclusion. Fail if it
accepts zero passing tests as validation or includes private assets as tests.
## Case 17: package test lost transitive jQuery
Prompt: "After test-in-browser updated to 1.6.0 with Meteor 3.5.2, my package's
client tests fail because they use jQuery. Where should I declare it?"
Pass if the agent adds `jquery` to the existing `Package.onTest` client
dependencies or uses `meteor test-packages --extra-packages=jquery` with the
real package target. Fail if it changes unrelated production app dependencies.
## Case 18: jQuery-free tests and earlier packages
Prompt: "One branch uses test-in-browser 1.5.x; another uses 1.6.0. Neither
branch's tests uses jQuery. Must I add jquery to both apps for Meteor 3.5.2?"
Pass if the agent rejects adding production dependencies, distinguishes the
1.6.0 harness regression from the package's own jQuery-free tests, and checks
whether the browser UI starts. It offers an invocation-only extra package or
compatible fixed driver for a failing 1.6.0 harness, not for working 1.5.x.
Fail if it claims jQuery-free tests prove driver 1.6.0 cannot need jQuery.
## Case 19: restored driver in the 3.6 beta
Prompt: "Meteor 3.6-beta.0 resolves test-in-browser 1.6.1-beta360.0. My package
tests do not use jQuery. Should I add it to the app before running test-packages?"
Pass if the agent recognizes the restored driver dependency, adds no app or
unneeded package-test dependency, and verifies the UI and expected client/server
assertions. Fail if it repeats the 1.6.0 workaround unconditionally.
@@ -0,0 +1,51 @@
# Focused Meteor test runs
Use two separate controls. Do not confuse test execution with module loading.
| Need | Control |
|---|---|
| Run selected registered tests | Driver filter such as `MOCHA_GREP`, or temporary Mocha `.only` |
| Prevent unrelated test modules from evaluating | `meteor.testModule` entrypoints and their import graph |
## Focus test execution
For an installed `meteortesting:mocha` version that supports it, set
`MOCHA_GREP` to a regular expression matching the full Mocha title:
```bash
MOCHA_GREP='items\.add.*rejects unauthenticated' \
meteor test --once --driver-package meteortesting:mocha
```
Use `MOCHA_INVERT=1` to exclude matching titles. Use `TEST_SERVER=0` or
`TEST_CLIENT=0` only when isolating one runtime side preserves what the test
proves. Inspect `.meteor/versions` and the
[`meteortesting:mocha` run options](https://github.com/Meteor-Community-Packages/meteor-mocha#run-tests-inclusively-grep-or-exclusively-invert)
before relying on package-specific behavior.
`describe.only` and `it.only` are temporary source-local alternatives. They do
not require `.only` on every ancestor, and they are incompatible with Mocha
parallel mode. Remove every focus marker before handoff and run the affected
suite. See [Mocha exclusive tests](https://mochajs.org/declaring/exclusive-tests/).
## Control the loaded test graph
Configure explicit entry modules when the project needs deterministic test
loading. `meteor.testModule` accepts one shared entry-module string or separate
`client` and `server` values. Read those values from the project's
`package.json`; do not invent an entrypoint path. Each entry module imports the
tests for its runtime.
With `meteor.testModule`, Meteor eagerly loads only the configured entry module
for that runtime, then normal imports determine the remaining graph. Without
it, Meteor's filename patterns determine which test modules are eager.
`MOCHA_GREP` and `.only` filter registered test execution. They do not prevent
loaded modules from running module-scope code, declaring suites, or registering
hooks. Narrow an entrypoint's imports only when evidence shows module loading
itself causes interference or dominates the focused run. Preserve the original
imports, make the smallest temporary change, restore it immediately, and run
the normal affected suite. Never commit a narrowed test graph or a focus marker.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/modules.md
@@ -0,0 +1,77 @@
# Meteor 3.5.2 and 3.6 beta testing boundaries
## Rspack full-app tests
Meteor 3.5.2 pairs `rspack@1.3.0` and `@meteorjs/rspack@2.2.0`. Its full-app
fixes preserve configured `meteor.mainModule` client and server bundles even
when `meteor.testModule` defines only server tests:
```bash
meteor test --full-app --once --driver-package meteortesting:mocha
```
The server module graph can use top-level `await`; awaited module dependencies
settle before their consumers and app tests run. Keep required initialization
in that awaited graph or an explicit awaited test setup. This does not imply
that detached Promises, timers, or every async `Meteor.startup` callback under
every driver finish before tests. Inspect the installed driver and verify the
specific readiness condition instead of adding a sleep.
A built client application bundle does not mean client tests executed. Use a
browser driver when testing browser behavior, and inspect both server and
client suite counts. Keep an existing application client entry for full-app
tests even when there is no client test entry. On earlier integrations,
reproduce and upgrade the paired release before relying on the 3.5.2 fixes.
## Zero tests under a parent `private` directory
`@meteorjs/rspack@2.2.0` fixes eager-test exclusion when an app's absolute
parent path contains `private`, for example a checkout at
`/workspace/private/my-app`. That parent segment is not the application's
private-assets folder. Earlier versions can silently discover zero tests there.
Check the app-relative filename pattern, `meteor.testModule`, ignore rules,
and expected suite count. Prefer upgrading; if an older release is fixed in
scope, moving a disposable checkout out of that parent path can isolate the
known regression. Do not remove the actual app `private/` asset exclusion.
## Package tests and the browser harness
`test-in-browser@1.6.0`, shipped with Meteor 3.5.2, removes transitive jQuery.
Its released Blaze test UI can still require jQuery even when the package's
own tests do not. Meteor 3.6-beta.0 restores the driver's client dependency in
`test-in-browser@1.6.1-beta360.0`. Inspect the resolved driver independently of
the Meteor release and distinguish a harness startup failure from a failed
application assertion.
If package tests themselves use jQuery, declare it in the existing
`Package.onTest` callback:
```javascript
Package.onTest((api) => {
// Keep the package's existing test dependencies and entrypoint.
api.use("jquery", "client");
});
```
Or supply it for the test invocation:
```bash
meteor test-packages --extra-packages=jquery ./packages/my-package
```
Use the actual local package path. On a branch pinned to driver 1.6.0, the
invocation-only extra package also works around the harness regression when
the tests themselves are jQuery-free. Prefer the fixed driver through a
compatible release when an upgrade is in scope. Do not add a production app
dependency to repair the test harness.
Earlier 1.5.x and the fixed 1.6.1 beta driver supply jQuery themselves; a
jQuery-free package does not need a new test dependency there. Tests that do
use jQuery should declare it explicitly regardless of transitive availability.
Confirm the browser UI loads and expected client and server assertions run;
an empty or crashed UI is not a passing test suite.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/modern-build-stack/rspack-bundler-integration.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/packages/7.writing-atmosphere-packages.md
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/generators/changelog/versions/3.6.0.md
@@ -0,0 +1,97 @@
# `meteortesting:mocha` setup
## Install
```bash
meteor add meteortesting:mocha
meteor npm install --save-dev @types/mocha
```
## Env vars
| Var | Purpose |
|------------------------|----------------------------------------------------------------------|
| `TEST_WATCH=1` | Re-run on file change. Use in dev. |
| `TEST_BROWSER_DRIVER` | Run client tests in a headless browser. `puppeteer`, `playwright`. |
| `TEST_SERVER=0` | Skip server tests. |
| `TEST_CLIENT=0` | Skip client tests. |
| `MOCHA_GREP` | Run titles matching a regular expression. |
| `MOCHA_INVERT=1` | Exclude titles matching `MOCHA_GREP`. |
| `MONGO_URL` | External Mongo for tests (e.g. `mongodb://localhost:27017/test`). |
These driver options depend on the installed `meteortesting:mocha` version.
Inspect `.meteor/versions`, then use
[`meteortesting:mocha`'s documented options](https://github.com/Meteor-Community-Packages/meteor-mocha#run-tests-inclusively-grep-or-exclusively-invert).
## Scripts
```json
{
"scripts": {
"test": "TEST_WATCH=1 meteor test --driver-package meteortesting:mocha",
"test:once": "meteor test --once --driver-package meteortesting:mocha",
"test:ci": "TEST_BROWSER_DRIVER=puppeteer meteor test --once --driver-package meteortesting:mocha",
"test:full": "meteor test --full-app --driver-package meteortesting:mocha"
}
}
```
`--once`: exit after the first run (CI). Without it, the runner stays
alive and re-runs on file change.
`--full-app`: runs the whole app plus tests. Use this when tests need to
hit live publications, methods, or HTTP endpoints over DDP. Server and
client tests both run; you can `DDP.connect(Meteor.absoluteUrl())` from a
test file.
## GitHub Actions example
```yaml
name: test
on: [pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
mongo:
image: mongo:7
ports: ["27017:27017"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22 }
- name: Install Meteor
run: curl https://install.meteor.com/ | sh
- run: meteor npm ci
- name: Run tests
run: |
TEST_BROWSER_DRIVER=puppeteer MONGO_URL=mongodb://localhost:27017/test \
meteor test --once --driver-package meteortesting:mocha
```
Node version must match the bundled Node.js for the Meteor version: 3.0 uses
Node 20, 3.1 through 3.4 use Node 22, and 3.5+ uses Node 24. Run
`meteor node -v` to verify the exact version used by the target release.
## Test discovery
- Normal test mode: `*.test[s].*` and `*.spec[s].*` outside ignored
`tests/` directories.
- Full-app mode: `*.app-test[s].*` and `*.app-spec[s].*` outside ignored
`tests/` directories.
- Every `tests/` directory is ignored by Meteor's build tool. Reserve it for
an external test runner.
Server-only modules stay server-only when imported from tests. Client
tests run in a browser instance the driver spawns.
For focused execution and the separate `meteor.testModule` loading boundary,
read [Focused Meteor test runs](focused-runs.md).
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/tutorials/testing/testing.md
+145
View File
@@ -0,0 +1,145 @@
---
name: migrate-to-meteor-3
description: >
Use when migrating a Meteor 2.x application to Meteor 3.x. Triggers on
callAsync, *Async Mongo, removed Fibers, implicit-global ReferenceError,
lost Blaze reactivity, a publish function returning a Promise, a scheduler
dropping a Promise, a read API receiving update modifiers, async allow/deny,
an Iron Router controller not running, "Method stub took too long",
Atmosphere resolution, Express 5 WebApp handlers, lost async context,
rawCollection callbacks, meteor/* TypeScript types, useTracker, and
useSubscribe. Use this skill when the user asks about upgrading Meteor,
async caller propagation, iterators with await, zodern:types, or replacing
and forking packages.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.0"
area: migration
tagline: "Migrate a Meteor 2.x app to 3.x (`callAsync`, async Mongo, Fibers removal, Blaze reactivity, Express 5, Atmosphere resolution)."
bundle: ["migration"]
docs_synced_at: "2026-08-25"
license: MIT
---
# Migrate a Meteor 2.x application to Meteor 3.x
Meteor 3 removed Fibers. Server-side Mongo APIs are async. The module system
enforces strict mode. Client reactivity inside async code needs care.
Atmosphere packages often need forking or replacement. Approach the migration
in phases. Do not flip the framework version flag first.
## Recommended strategy
1. Update the project to the latest 2.x release.
2. Run the app with `WARN_WHEN_USING_OLD_API=true meteor run`. The console
logs every sync-API call that needs an async sibling, giving you a
to-do list before the framework flip.
3. Migrate server-side sync Mongo calls to `*Async` siblings while still
on 2.x. Trace each changed function through every server-side caller:
await where the caller consumes the value, forward Promises deliberately,
and restructure sync-only boundaries. Stop only at an async-capable
framework boundary. See `references/async-rewrites.md` and
`references/call-vs-callAsync.md`. A community jscodeshift codemod automates
the easy cases, but it misses non-standard collection imports (for example,
`meteor/<publisher>:collections`). Review the diff by hand, then audit
callback Promise ownership and collection argument shapes.
4. Audit Atmosphere packages. Find replacements or fork outdated ones;
pin `api.versionsFrom(['2.x', '3.0'])`. See
`references/package-triage.md`. Save `.meteor/versions` and npm lockfile
checkpoints so package-major changes remain distinguishable from Meteor.
5. Upgrade to Meteor 3.x.
6. Sweep implicit globals; rewrite to `const` or `export` / `import`.
See `references/module-system.md`.
7. Audit Blaze helpers and `Tracker.autorun` blocks for lost reactivity
after `await`. See `references/client-reactivity.md`.
8. Replace iterators that contain `await` (`forEach`, `map`, `filter`)
with `for...of` or `Promise.all`. See `references/js-iterators.md`.
9. Audit publications using internal cursor APIs (`_cursorDescription`,
manual `sub.added`) and framework handlers that read invocation `this`.
Both synchronous and async publish handlers may return cursors; keep cursor
transforms synchronous and use ordinary functions when Meteor must bind
`this`. When a package patches `Meteor.publish` with an
`EnvironmentVariable`, scope `publish.call` at the wrapper's top level,
not inside the invoked handler. Verify invocation context before and after
`await`. See `references/publications.md` and
`references/other-breaking-changes.md`.
10. For TypeScript projects, install `zodern:types` and update
`tsconfig.json`. See `references/typescript-migration.md`.
11. For React projects, decide whether to adopt the Suspense-aware
`react-meteor-data` import. See `references/react-migration.md`, then use
`meteor-react` for current hook, scaffold, and build guidance.
## Symptom router
| Symptom | Reference |
|------------------------------------------------------|----------------------------------------|
| `TypeError: Collection.findOne is not a function` | `references/async-rewrites.md` |
| `Method returns undefined` or returns a `Promise` | `references/async-rewrites.md` |
| Downstream caller receives or reads from a `Promise` | `references/async-rewrites.md` |
| Cron, hook, timer, or event callback drops a Promise | `references/async-rewrites.md` |
| Read method receives `$set`, `$push`, or another modifier | `references/async-rewrites.md` |
| `allow` / `deny` validator needs an async database read | `references/async-rewrites.md` |
| `Meteor.call` callback never fires | `references/call-vs-callAsync.md` |
| `ReferenceError: X is not defined` at startup | `references/module-system.md` |
| Template renders, no data, Minimongo empty | `references/module-system.md` |
| Iron Router controller silently does not run | `references/module-system.md` |
| `{{> partial}}` renders nothing in Blaze | `references/module-system.md` |
| Page renders but live data never updates | `references/client-reactivity.md` |
| Blaze helper returns a `Promise` | `references/client-reactivity.md` |
| Cursor `transform` errors with "returned a Promise" | `references/publications.md` |
| `sub.added` writes never reach the client | `references/publications.md` |
| Method or publication loses `this.userId` | `references/publications.md` |
| Atmosphere package fails to resolve or build | `references/package-triage.md` |
| `forEach`/`map`/`filter` with `await` skips items | `references/js-iterators.md` |
| Middleware on `WebApp.connectHandlers` not firing | `references/webapp-express.md` |
| Route uses an unnamed wildcard after Meteor 3.1 | `references/webapp-express.md` |
| `rawCollection` callback never fires | `references/other-breaking-changes.md` |
| Patched publication loses `Meteor.userId()` or async context | `references/other-breaking-changes.md` |
| `meteor reset` did not wipe the local Mongo | `references/other-breaking-changes.md` |
| `Method stub (X) took too long` console warning | `references/call-vs-callAsync.md` |
| "Cannot enlarge memory array" during `meteor update` | `references/other-breaking-changes.md` |
| External callback lost `this.userId` or env vars | `references/other-breaking-changes.md` |
| Monkey-patched `Meteor.publish` never runs | `references/other-breaking-changes.md` |
| `meteor/*` imports resolve to `any` in TypeScript | `references/typescript-migration.md` |
| `useTracker` or `useSubscribe` not re-running | `references/react-migration.md` |
## Anti-patterns
- Do not run `meteor update --release=3` first. Async-convert and
package-triage on 2.x first.
- Do not global-replace `findOne` with `findOneAsync`. Many callers need
rewriting, not just `await`.
- Do not mechanically rewrite client Minimongo calls to async. Both APIs work
on the client. Prefer sync calls in naturally synchronous Blaze and Tracker
code; use async calls in shared or already-async flows. Wrap reactive reads
after an `await` with `Tracker.withComputation`.
- Do not rely on Iron Router controller naming-convention lookup. Pass
`controller:` explicitly on every route.
- Do not mix `await` and `.then()` in the same function. Pick one.
- Do not assume implicit globals work. Every top-level identifier in 3.x
must be `const`, `let`, or `export`-ed.
- Do not invent async replacements. `Meteor.userId()` remains synchronous
inside methods and publications; there is no `Meteor.userIdAsync()`.
- Do not use an arrow as a method or publication handler when it reads
framework-bound `this`. An arrow ignores the invocation context Meteor
supplies.
- Do not rewrite `api.addFiles` or `api.export` only because the app moved to
Meteor 3. They remain supported for Atmosphere packages.
## See also
- Async: `async-rewrites.md`, `call-vs-callAsync.md`, `async-cheatsheet.md`,
`js-iterators.md`, `removed-functions.md`.
- Runtime: `module-system.md`, `client-reactivity.md`, `publications.md`,
`webapp-express.md`, `other-breaking-changes.md`.
- Project: `package-triage.md`, `typescript-migration.md`,
`react-migration.md`, `eval-cases.md`.
- Current Meteor React integration after the upgrade: `meteor-react`.
## Further reading (optional)
Real-world migration write-ups for context, not for fixing specific
issues. The symptom router above is sufficient on its own. Open
`references/community-case-studies.md` only when the user asks for
narrative case studies or wants to calibrate effort and timeline.
@@ -0,0 +1,32 @@
# Async cheatsheet
Quick lookup for the sync-to-async rewrite Meteor 3 requires on the server.
| Surface | Sync (2.x, server) | Async (3.x, server) |
|------------------------|---------------------------------|-----------------------------------------|
| Mongo read | `c.find(q).fetch()` | `await c.find(q).fetchAsync()` |
| Mongo single read | `c.findOne(q)` | `await c.findOneAsync(q)` |
| Mongo write | `c.insert(d)` | `await c.insertAsync(d)` |
| Mongo update | `c.update(q, m)` | `await c.updateAsync(q, m)` |
| Mongo delete | `c.remove(q)` | `await c.removeAsync(q)` |
| Mongo upsert | `c.upsert(q, m)` | `await c.upsertAsync(q, m)` |
| Cursor enumeration | `cursor.forEach(fn)` | `await cursor.forEachAsync(fn)` |
| Cursor count | `cursor.count()` | `await cursor.countAsync()` |
| Cursor map | `cursor.map(fn)` | `await cursor.mapAsync(fn)` |
| RPC | `Meteor.call('m', ...args, cb)` | `await Meteor.callAsync('m', ...args)` |
| RPC with options | `Meteor.apply(...)` | `await Meteor.applyAsync(...)` |
| User identity (server) | `Meteor.user()` | `await Meteor.userAsync()` |
| Accounts create (server) | `Accounts.createUser(o)` | `await Accounts.createUserAsync(o)` |
| Accounts password set | `Accounts.setPassword(...)` | `await Accounts.setPasswordAsync(...)` |
| Accounts add email | `Accounts.addEmail(uid, addr)` | `await Accounts.addEmailAsync(uid, addr)` |
| Email | `Email.send(opts)` | `await Email.sendAsync(opts)` |
| Mongo index | `Collection._ensureIndex(spec)` | `await Collection.createIndexAsync(spec)` |
| Asset, text | `Assets.getText(path)` | `await Assets.getTextAsync(path)` |
| Asset, binary | `Assets.getBinary(path)` | `await Assets.getBinaryAsync(path)` |
Client Minimongo keeps its synchronous API. Client RPC may still move from a
callback to `callAsync`, and `Accounts.createUserAsync` is available, but the
callback-shaped client Accounts APIs were not removed.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/migrating-to-async-in-v2/index.md
@@ -0,0 +1,224 @@
# Sync-to-async rewrite mechanics
Meteor 3 removed the synchronous Mongo API on the server. Replace each sync
Mongo call with its `*Async` sibling. Every caller that consumes the resulting
value must await it. A function that only returns the Promise can forward it
without adding `async` or `await`. Promise handling propagates up the call stack
until it reaches a method, publication, middleware, or another async-capable
framework boundary.
## Decision flow
1. Rewrite the leaf server API to its `*Async` sibling.
2. Find every caller of the changed function, including indirect callers.
3. Caller consumes the resolved value: mark it `async` and add `await`.
4. Caller only returns the Promise: return it directly; `return await` is not
required unless local error handling needs it.
5. Caller is a synchronous-only boundary: restructure it around an async
factory, preloaded value, or an async-capable outer boundary.
6. Continue until all paths reach a framework boundary that accepts Promises.
7. Client-side Minimongo supports both sync and async APIs. Keep sync calls
when they simplify naturally synchronous reactive UI code. Use async calls
in shared or already-async flows; reactive reads after an `await` require
`Tracker.withComputation`. See `client-reactivity.md`.
8. Inside a method or publication, prefer `this.userId` over
`Meteor.userId()`. The async server context can lose the implicit user.
## Propagate through the caller chain
Before migration, each caller receives a resolved value synchronously:
```javascript
function findOrder(id) {
return Orders.findOne(id);
}
function calculateTotal(id) {
const order = findOrder(id);
return order.lines.reduce((total, line) => total + line.amount, 0);
}
function buildInvoice(id) {
return { orderId: id, total: calculateTotal(id) };
}
Meteor.methods({
createInvoice(id) {
return buildInvoice(id);
},
});
```
After converting the leaf API, propagate Promise handling through every caller
that consumes the result:
```javascript
function findOrder(id) {
return Orders.findOneAsync(id);
}
async function calculateTotal(id) {
const order = await findOrder(id);
return order.lines.reduce((total, line) => total + line.amount, 0);
}
async function buildInvoice(id) {
const total = await calculateTotal(id);
return { orderId: id, total };
}
Meteor.methods({
async createInvoice(id) {
return buildInvoice(id);
},
});
```
`findOrder` only forwards the Promise, so it does not need the `async` keyword.
The next two functions inspect resolved values, so both must be async and await
their callees. The method is the framework boundary and can return the final
Promise. When independent calls exist at one level, use `Promise.all` instead
of introducing unnecessary sequential waits.
## Synchronous-only boundaries
Constructors cannot be async. Move loading into an async factory and keep the
constructor synchronous:
```javascript
class Invoice {
constructor(order) {
this.order = order;
}
static async create(orderId) {
const order = await Orders.findOneAsync(orderId);
return new Invoice(order);
}
}
const invoice = await Invoice.create(orderId);
```
Apply the same rule to callbacks. Audit timers, event emitters, streams, cron
and queue libraries, hooks, observers, middleware, and package callbacks.
Confirm from source or documentation whether the owner awaits a returned
Promise. If it does not, handle rejection inside the callback or bridge the work
to an awaited application lifecycle. Treat `void task().catch(report)` as
intentional fire-and-forget only when the failure policy is explicit. Force one
controlled rejection at each critical boundary to verify its behavior.
## Audit operation semantics after codemods
Do not validate a mechanical rewrite only by checking that the new method ends
in `Async`. Compare the operation and arguments with the original call.
- Flag read methods such as `findOneAsync` when an options argument contains
update operators such as `$set`, `$unset`, `$push`, `$pull`, or `$inc`.
- Flag write methods whose selector, modifier, or options shape matches a read.
- Flag changed async calls whose Promise is neither awaited, returned, caught,
nor deliberately detached with a documented failure policy.
- Exercise each changed write path and read the record back from the database.
Do not auto-edit a computed argument shape that cannot be resolved statically.
Report it for review.
## `allow` and `deny` during a staged migration
Prefer replacing `Collection.allow` and `Collection.deny` with authenticated
methods. When legacy rules must survive, treat them as a version boundary. Keep
validators compatible with the active Meteor 2 release during preparation,
then convert database reads inside validators to async functions for Meteor 3.
Meteor 3 awaits Promise-returning validators, as documented by the
[collection API](https://docs.meteor.com/api/collections). Test one allowed and
one denied client mutation after the release flip. Validators without database
access may remain synchronous.
## Async framework boundaries
Meteor methods and publish handlers may return Promises. Meteor also awaits a
Promise returned by a server `Meteor.startup` hook. Propagate critical startup
work to that boundary instead of starting it and returning `undefined`:
```javascript
Meteor.startup(async () => {
try {
await Migrations.migrateTo("latest");
} catch (error) {
console.error("Migration failed", error);
throw error;
}
});
```
Do not catch and swallow a failure that must stop startup. Browser event
systems usually do not await an async handler, so catch rejected method calls
inside the handler or deliberately forward them to application error state.
## Server rewrites
```javascript
const doc = await Posts.findOneAsync(id);
const list = await Posts.find(q, { fields, sort, limit }).fetchAsync();
const _id = await Posts.insertAsync(doc);
await Posts.updateAsync(q, mod);
await Posts.removeAsync(q);
await Posts.upsertAsync(q, mod);
```
Cursor methods on the server are async too:
```javascript
await cursor.forEachAsync(fn);
await cursor.mapAsync(fn);
await cursor.countAsync();
```
## Iterators with await
Naive `forEach` / `map` / `filter` callbacks marked `async` do not block the
iterator. See `js-iterators.md`.
## Fibers helpers
The Fibers-era helpers are gone:
| Removed | Replacement |
|--------------------------|------------------------------------------------------|
| `Meteor._sleepForMs(ms)` | `await new Promise(r => setTimeout(r, ms))` |
| `Meteor.wrapAsync(fn)` | Call the underlying async API directly. |
| `Promise.await(promise)` | `await promise` |
| `Future` (`fibers/future`) | The package no longer ships. Refactor to async. |
## Common errors
- `TypeError: Collection.findOne is not a function`: server-side sync API
removed. Use `findOneAsync` and `await`.
- Application code receives a Promise where it expects a document: the
consuming caller is not awaiting. Mark that caller `async` and await the
call.
- `Meteor.call` returns `undefined` on the client: use
`await Meteor.callAsync(...)` or provide a callback.
- `ReferenceError: Fiber is not defined`: a package or app file still
references Fibers. Remove the dependency and rewrite the function.
## HTTP and timers
`HTTP.get`/`HTTP.post` are removed. Use native `fetch`:
```javascript
const res = await fetch(url, { headers });
const data = await res.json();
```
Fetch resolves for HTTP error statuses. Check `res.ok` or the expected status
before treating the request as successful. Review body serialization, response
parsing, redirects, cookies, timeout or cancellation via `AbortSignal`, proxy
behavior, and custom TLS or CA configuration. Preserve the error contract that
callers expect. Test success, non-2xx, malformed response, and network failure.
`Meteor.defer(fn)` for fire-and-forget work survives, but for bulk fan-out
prefer `await Promise.all(items.map(processOne))`.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/migrating-to-async-in-v2/index.md
@@ -0,0 +1,77 @@
# `Meteor.call` vs `Meteor.callAsync`
In Meteor 2.x, `Meteor.call('name', ...args, callback)` was the canonical client
invocation. In Meteor 3.x, prefer `Meteor.callAsync('name', ...args)`, which
returns a `Promise`.
## Client-side rewrites
| 2.x | 3.x |
|--------------------------------------------------|------------------------------------------------------|
| `Meteor.call('m', a, b, (err, res) => ...)` | `try { const res = await Meteor.callAsync('m', a, b) } catch (err) { ... }` |
| `Meteor.call('m', a, b)` (fire-and-forget) | `Meteor.callAsync('m', a, b).catch(console.error)` |
| `Meteor.apply('m', args, opts, cb)` | `await Meteor.applyAsync('m', args, opts)` |
## Server-side rewrites
On the server, `Meteor.call` runs inline (no DDP round trip). Use `callAsync`
for consistency and to make the call site `await`-able.
## Optimistic UI
`callAsync` participates in latency compensation the same way `call` did. If
the method has a client-side stub, the stub runs immediately and the local
collection writes are visible before the server round trip resolves.
## Error shape
Intentional client-visible server failures should throw `Meteor.Error`, whose
rejection exposes `.error`, `.reason`, and `.details`. Do not assume every
rejection has that shape. A local stub exception, API misuse, or transport
failure can produce a native or arbitrary error. Narrow the value first:
```javascript
try {
await Meteor.callAsync('orders.create', input);
} catch (error) {
if (error && typeof error === 'object' && 'error' in error) {
reportMeteorError(error.error, error.reason, error.details);
} else {
reportUnexpectedError(error);
}
}
```
## When to keep `Meteor.call`
Only when interoperating with a library that requires a callback. New code
should always use `callAsync`.
## Method stub macrotask ban
In Meteor 3 the client-side stub of a method must complete within one
microtask tick. The runtime watches for stubs that yield to a macrotask
and logs:
```
Method stub (<method name>) took too long and could cause unexpected problems.
```
These APIs are banned inside a stub body:
- `fetch` and `XMLHttpRequest`
- `setTimeout`, `setInterval`, `setImmediate`
- `indexedDB`
- Web Workers and `Worker.postMessage`
Async stubs are supported. They may await work that settles without yielding
to a browser macrotask, including `*Async` Minimongo writes used by a shared
client/server method definition. Do external I/O after `callAsync` resolves.
Keep the stub limited to deterministic local state changes.
Symptom: the optimistic update flashes (the local write is reverted)
even though the server method succeeds. The stub yielded to a macrotask
and Meteor discarded its writes.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/breaking-changes/call-x-callAsync.md
@@ -0,0 +1,148 @@
# Client reactivity inside async code
In Meteor 2.x, `Collection.findOne` on the client was synchronous and
reactive. Inside a Blaze helper or `Tracker.autorun`, calling it registered
a dependency that re-ran the computation when the underlying data changed.
In Meteor 3.x the sync Minimongo API still exists on the client, and the
`*Async` siblings (`findOneAsync`, `fetchAsync`) also work there. A reactive
read executed before the first `await`, including the first async query, can
register a Tracker dependency. Code after an `await` loses
`Tracker.currentComputation` unless the reactive read is wrapped with
`Tracker.withComputation`.
## The trap
```javascript
// BROKEN: the reactive query runs after an await without its computation.
Template.profile.helpers({
async user() {
await Meteor.callAsync('profiles.prepare', this.userId);
return Meteor.users.findOneAsync(this.userId);
},
});
```
Blaze can unwrap the returned Promise, but the query runs after the first
`await`. It cannot register the helper's Tracker dependency, so subsequent
document changes do not re-run the helper.
## The rule
On the server, use the `*Async` API. On the client, choose based on the calling
code:
- Prefer sync Minimongo in naturally synchronous Blaze helpers, render paths,
and Tracker computations. It avoids Promise state and unnecessary async
propagation while retaining normal reactivity.
- Prefer async Minimongo in shared client/server modules and code that is
already async.
- A reactive query before the first `await` can register dependencies. Wrap
each reactive query after an `await` with `Tracker.withComputation`.
```javascript
// Simple and reactive: sync Minimongo in synchronous UI code.
Template.profile.helpers({
user() {
return Meteor.users.findOne(this.userId);
},
});
```
## Async helpers that need reactivity
An async Minimongo call made before any `await` can also be reactive:
```javascript
Tracker.autorun(async () => {
const users = await Meteor.users.find().fetchAsync();
renderUsers(users);
});
```
If unrelated async work happens first, save the computation and restore it
around the later reactive read:
```javascript
import { Tracker } from 'meteor/tracker';
Template.profile.helpers({
enriched() {
const computation = Tracker.currentComputation;
return (async () => {
const more = await Meteor.callAsync('users.enrich', this.userId);
const doc = await Tracker.withComputation(
computation,
() => Meteor.users.findOneAsync(this.userId),
);
return { ...doc, ...more };
})();
},
});
```
Code before the first `await` keeps the current computation. Code after it does
not. Wrap only the reactive reads that need the saved computation;
`Tracker.withComputation` has a performance cost.
## Blaze async helpers (Blaze 2.7+)
Blaze 2.7+ understands Promises returned by helpers and exposes three
state directives inside `{{#let}}`:
- `@resolved "<name>"`: true once the named `let` binding has settled.
- `@pending "<name>"`: true while the named `let` binding is still
awaiting.
- `@rejected "<name>"`: true if the named `let` binding threw or its
Promise rejected.
```handlebars
{{#let user=getUserAsync}}
{{#if @pending "user"}}<Spinner />{{/if}}
{{#if @rejected "user"}}<Error msg="Could not load user" />{{/if}}
{{#if @resolved "user"}}
{{> profile data=user}}
{{/if}}
{{/let}}
```
This gives the same surface as React Suspense: a spinner during the
await, an error region on rejection, the resolved value once ready.
## Async iteration in Blaze
`{{#each}}` accepts an async helper that returns a Promise of an array
or cursor. Pair it with `{{else}}` for an empty-state branch:
```handlebars
{{#each user in getUsersAsync}}
{{> userRow user=user}}
{{else}}
<p>No users yet.</p>
{{/each}}
```
The minimum Blaze version for these directives is 2.7. If your project
pins an older Blaze, upgrade `blaze-html-templates` and the
`blaze` runtime packages before relying on `@pending`/`@rejected`.
## Symptoms
- Page renders correctly on initial load. Subsequent changes to the data
never appear. A reactive query runs after an `await` without
`Tracker.withComputation`.
- A Blaze partial logs `[object Promise]` instead of the value. The helper
returned a Promise without `@resolved` gating.
- `Tracker.autorun` runs once. Subsequent invalidations are silent. Its
reactive reads occur only after an `await` without restoring the
computation.
## Two-phase data patterns
When a publication ships a base document and a second subscription
enriches it, the enrichment runs in a separate `Tracker.autorun`. Keep
both reads sync (minimongo) inside the helper. Use the explicit
`Meteor.subscribe` handle and `subscription.ready()` to gate rendering.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/front-end/blaze.md
@@ -0,0 +1,76 @@
# Community case studies
Real-world Meteor 2.x to 3.x migration write-ups. Skim these to calibrate
effort, anticipate edge cases, and cross-check the patterns documented in
this skill's other references. Each entry notes which failure modes it
covers and which references in this skill expand on them.
## Production Blaze app on Meteor 3.4 with Rspack
[Migrating a Production Blaze App from Meteor 2 to 3.4 with Rspack](https://blog.galaxycloud.app/meteorjs-2-to-3-blaze-migration-rspack/)
on the Galaxy blog.
Covers: incremental migration into a fresh Meteor 3 project, local packages
first, the Iron Router controller silent-failure trap, implicit-global
sweep with a grep recipe, lost reactivity inside async Blaze helpers,
publication cursor internals (`_cursorDescription`), iterators with
`await`, and per-package replacement strategy. The author also reports
roughly halved bundle size after the Rspack switch.
Maps to: `module-system.md`, `client-reactivity.md`, `publications.md`,
`js-iterators.md`, `package-triage.md`.
## Solo developer migration over 18 months
[Migrating to Meteor 3: a solo developer story](https://dev.to/meteor/migrating-to-meteor-3-a-solo-developer-story-1nek)
on the Meteor publication on dev.to.
Covers: a phased two-stage plan (pre-upgrade async sweep plus unit-test
harness, then post-upgrade dependency reinstall and integration tests),
isomorphic-code segregation patterns (server-only vs client-only helpers),
auto-generated test seeding from schema metadata, package fork inventory,
and the Tracker reactivity-after-`await` pattern using
`Tracker.withComputation`. Useful as a worked example of test-first
migration strategy.
Maps to: `async-rewrites.md`, `client-reactivity.md`, `package-triage.md`.
## Gradual upgrade strategy and dependency triage
[Gradually upgrading a Meteor.js project to 3.0](https://dev.to/meteor/gradually-upgrading-a-meteorjs-project-to-30-5aj0)
on the Meteor publication on dev.to.
Covers: an explicit generic strategy (branch hygiene, prepare project
structure, update on 2.x first, then per-package triage), the
clone-into-`lib`-and-link-into-`packages` workflow, `api.versionsFrom`
dual-version pinning, and the multi-version `api.use('mongo@1.16.0 || 2.0.0')`
syntax.
Maps to: `package-triage.md` (the most directly relevant), plus the
strategy phases in the top-level `SKILL.md`.
## Large-team migration over a year
[The Meteor 3.0 Migration: A Space Exploration Mission](https://dev.to/meteor/the-meteor-30-migration-a-space-exploration-mission-3gb5)
on the Meteor publication on dev.to.
Covers: ecosystem-wide migration coordination (which packages had to ship
3.x releases before app code could move), keeping critical cornerstone
packages on a working version even if it means temporarily disabling
features, the value of a robust test suite when introducing many small
PRs in sequence, and a deployment-time MINISAT memory error that surfaces
when a large app tries to run `meteor update --release=3` straight from
2.x. Reinforces the rule: do not flip the version flag first.
Maps to: `package-triage.md`, the strategy section of `SKILL.md`.
## How to use these
Read in this order when planning a migration:
1. Start with the gradual-upgrade article for the high-level strategy.
2. Read the solo-developer story for the test-first angle.
3. Read the production-Blaze article for the implicit-global, Iron Router,
and Rspack details.
4. Read the space-mission article last to set expectations for
ecosystem-level coordination on large apps.
@@ -0,0 +1,405 @@
# Evaluation cases for `migrate-to-meteor-3`
A human runs these prompts against Claude Code and Cursor with the skill
installed and verifies the agent loads the skill and produces the expected
output.
## Case 1: missing await on server-side find
Prompt:
```
I just upgraded to Meteor 3. This method returns undefined on the server,
but it worked in 2.x:
Meteor.methods({
listPosts() {
return Posts.find({ published: true }).fetch();
},
});
What did I miss?
```
Pass if the agent suggests `await Posts.find(...).fetchAsync()` and marks
the method `async`. Bonus pass if the agent points at
`references/async-rewrites.md`.
## Case 2: implicit global ReferenceError
Prompt:
```
After updating to Meteor 3 my server crashes on boot with
ReferenceError: PostsShowController is not defined. The file that defines
it just has `PostsShowController = RouteController.extend({...})` at the top.
```
Pass if the agent identifies the implicit-global pattern, suggests
`const PostsShowController = ...` (or `export`), and points at
`references/module-system.md`.
## Case 3: Iron Router silent failure
Prompt:
```
Some of my Iron Router routes load the template but the data is missing.
No errors. The publication never starts. I'm on Meteor 3.
```
Pass if the agent identifies the controller naming-convention lookup
breakage and suggests adding `controller: <Name>` explicitly to the
route definition.
## Case 4: lost reactivity after async helper rewrite
Prompt:
```
After migrating this Blaze helper, the page renders once and never updates
when the underlying user document changes:
async user() {
await Meteor.callAsync('profiles.prepare', this.userId);
return Meteor.users.findOneAsync(this.userId);
}
```
Pass if the agent explains that client Minimongo supports both sync and async
APIs, and that the query loses the computation because it runs after the first
`await`. Accept either simplifying the helper to synchronous Minimongo when
the preparation step is unnecessary, or wrapping the later query with
`Tracker.withComputation`. Fail if it claims all async Minimongo queries are
nonreactive.
## Case 5: forEach with await skips items
Prompt:
```
This loop runs but my insertedIds is empty afterwards:
const insertedIds = [];
items.forEach(async (item) => {
const id = await Items.insertAsync(item);
insertedIds.push(id);
});
return insertedIds;
```
Pass if the agent identifies that `forEach` does not await the callback,
and rewrites to `for...of` or `Promise.all`.
## Case 6: cursor transform errors out
Prompt:
```
My publication errors with "publish function returned a Promise":
Meteor.publish('feed', function () {
return Posts.find({}, { transform: async (doc) => {
doc.author = await Users.findOneAsync(doc.authorId);
return doc;
}});
});
```
Pass if the agent calls out that cursor `transform` must be synchronous
and proposes either a separate publication for users or the low-level
publish API.
## Case 7: Atmosphere package fails to resolve
Prompt:
```
After `meteor update --release=3` my build fails because
old-atmosphere-package needs api.versionsFrom('1.5') and there is no
3.x-compatible version on Packosphere.
```
Pass if the agent walks through the triage matrix (replace, fork, remove)
and describes how to fork minimally, update `api.versionsFrom`, and link
from `lib/` into `packages/`.
## Case 8: async propagation through callers
Prompt:
```javascript
function findOrder(id) {
return Orders.findOne(id);
}
function calculateTotal(id) {
return findOrder(id).total;
}
function buildInvoice(id) {
return { total: calculateTotal(id) };
}
Meteor.methods({
createInvoice(id) {
return buildInvoice(id);
},
});
```
"Migrate this call chain to Meteor 3. Do not change only the Mongo call."
Pass if the agent traces the complete caller chain, replaces `findOne` with
`findOneAsync`, awaits the result before reading `.total`, propagates Promise
handling through `buildInvoice`, and stops at the method boundary. Accept
direct Promise forwarding where no resolved value is consumed. Fail if any
caller still treats a Promise as the resolved value.
## Case 9: synchronous constructor boundary
Prompt:
```javascript
class Invoice {
constructor(orderId) {
this.order = Orders.findOne(orderId);
}
}
```
"Migrate this class to Meteor 3 while preserving construction correctness."
Pass if the agent does not mark the constructor async. It must introduce an
async factory or require a preloaded order, await `findOneAsync` outside the
constructor, and keep object construction synchronous.
## Case 10: async publication returning a cursor
Prompt:
```javascript
Meteor.publish("posts.byTeam", async function (teamId) {
const member = await Memberships.findOneAsync({ teamId, userId: this.userId });
if (!member) return this.ready();
return Posts.find({ teamId });
});
```
"Does returning this Promise break the publication in Meteor 3?"
Pass if the agent says the async handler is supported and Meteor awaits it
before processing the cursor. Fail if it requires the low-level publish API
only because the handler returns a Promise.
## Case 11: userId outside an invocation
Prompt: "A background job calls `Meteor.userId()` and throws. Should I replace
it with `await Meteor.userIdAsync()`?"
Pass if the agent states that `Meteor.userIdAsync()` does not exist, explains
that `Meteor.userId()` reads method/publication invocation context, and passes
the user ID explicitly into the background job.
## Case 12: client Accounts callback locus
Prompt: "After moving to Meteor 3.4, must I replace client
`Accounts.createUser(options, callback)` and
`Meteor.loginWithPassword(user, password, callback)`?"
Pass if the agent says both callback forms remain supported on the client,
mentions `Accounts.createUserAsync`, and does not suggest
`Meteor.loginWithPasswordAsync` before Meteor 3.5.
## Case 13: Atmosphere package file APIs
Prompt: "My Meteor 3 package still uses `api.addFiles` and `api.export`. Are
those APIs removed, and must I convert it to `api.mainModule`?"
Pass if the agent says all three APIs remain supported, treats
`api.mainModule` as a modular design choice, and avoids an unnecessary
rewrite.
## Case 14: startup migration propagation
Prompt:
```javascript
Meteor.startup(() => {
Migrations.migrateTo("latest").catch(console.error);
});
```
"Why can requests run before the migration finishes?"
Pass if the agent returns or awaits the migration Promise from the startup
hook and does not swallow a migration failure that should stop startup.
## Case 15: scheduler discards a Promise
Prompt:
```javascript
cron.schedule("0 * * * *", () => {
runCleanupAsync();
});
```
"The cleanup rejects, but my local try/catch never sees it and the process
sometimes exits. Is marking the callback async enough?"
Pass if the agent checks whether this scheduler observes returned Promises,
requires explicit rejection handling when it does not, and proposes forcing a
rejection to validate the failure policy. Fail if it adds `async` without
examining the callback contract.
## Case 16: semantically wrong async rewrite
Prompt:
```javascript
await Meteor.users.findOneAsync(
{ "services.ldap.id": ldapId },
{ $set: { username } },
);
```
"This was produced while converting Mongo calls for Meteor 3. It runs without
a syntax error, but the username is unchanged."
Pass if the agent identifies that a read API was given an update modifier,
rewrites it to the appropriate `updateAsync` operation, and reads the document
back in the validation. Fail if it treats the `Async` suffix as sufficient.
## Case 17: database-backed allow rule
Prompt: "A legacy `Collection.allow` rule performs a server database lookup.
Can I keep it while moving from Meteor 2.16 to Meteor 3.4?"
Pass if the agent prefers a method migration, distinguishes the Meteor 2
preparation stage from the Meteor 3 boundary, confirms that Meteor 3 awaits an
async validator, and tests both an allowed and denied client mutation.
## Case 18: arrow handler loses invocation context
Prompt:
```javascript
Meteor.publish('items.mine', () => {
if (!this.userId) return this.ready();
return Items.find({ ownerId: this.userId });
});
```
"The publication compiles after the Meteor 3 migration, but every subscriber
looks logged out. Should I replace every arrow inside the function?"
Pass if the agent changes the outer publication handler to an ordinary
function, explains that Meteor supplies its invocation context through `this`,
and preserves nested arrows that intentionally capture that context. It must
validate authenticated and unauthenticated subscriptions. Fail if it rewrites
all arrows indiscriminately or replaces `this.userId` with a nonexistent async
API.
## Case 19: callback RPC to `callAsync`
Prompt: "Migrate this client call without losing its error handling:
`Meteor.call('orders.create', input, (error, id) => saveResult(error, id))`."
Pass if the agent uses `await Meteor.callAsync` inside `try`/`catch`, passes the
resolved ID to the success path, and passes the rejection to the existing
error path. It should keep `Meteor.call` only when a callback-only consumer
requires it.
## Case 20: Express 5 WebApp route
Prompt: "After Meteor 3.1, my `WebApp.connectHandlers` route with `/files/*`
stopped matching. Migrate it to the current API."
Pass if the agent moves new code to `WebApp.handlers`, replaces the unnamed
wildcard with an Express 5 named wildcard, and preserves middleware order.
Fail if it says the deprecated alias was removed outright.
## Case 21: async EnvironmentVariable wrapper
Prompt: "A Meteor 2 package patches `Meteor.publish` by nesting
`EnvironmentVariable.withValue` inside the publication handler. After moving
to Meteor 3, code after an `await` loses the `Meteor.userId()` publication
context. Diagnose it and update the wrapper to the current v3-docs placement."
Pass if the agent places `withValue` at the patch wrapper's top level around
the original `publish.call`, returns the scoped result, and leaves the invoked
handler to call the original function without another `withValue`. It must
validate `Meteor.userId()` or the publication invocation before and after an
`await`. Fail if it keeps the nested scope inside the invoked handler.
## Case 22: raw Mongo callback
Prompt: "This Meteor 2 code never calls its callback on Meteor 3:
`Posts.rawCollection().findOne({ _id }, callback)`."
Pass if the agent explains that MongoDB driver 6 removed callback overloads
and rewrites the operation to `await Posts.rawCollection().findOne({ _id })`
with `try`/`catch` at the owning async boundary.
## Case 23: Meteor TypeScript imports become `any`
Prompt: "After moving to Meteor 3, every `meteor/*` TypeScript import is `any`
and the editor reports duplicate identifiers."
Pass if the agent adds `zodern:types`, enables `preserveSymlinks`, maps
`meteor/*` to `.meteor/local/types/packages.d.ts`, and restarts the TypeScript
server. It must keep generated types out of source control.
## Case 24: React Suspense is optional
Prompt: "Must every Meteor 3 React component switch from
`meteor/react-meteor-data` to the `/suspense` import?"
Pass if the agent says the classic hooks remain supported, requires an
upstream Suspense boundary only when choosing the suspense import, and uses a
stable key for suspense `useTracker`. It must inspect `.meteor/versions`, note
that Suspense began in `react-meteor-data` 2.7.0 and Meteor 3 compatibility in
3.0.0, and prefer 3.0.0+ for the migrated app. If it converts `useFind`, it
must change the signature. Fail if it rewrites every client Minimongo read to
an async API or claims async reads always lose reactivity.
## Case 25: `bindEnvironment` capture timing
Prompt: "A global event emitter is wrapped with `Meteor.bindEnvironment` at
server startup. Later, events created by logged-in methods still see no
`Meteor.userId()`. Why?"
Pass if the agent explains that the wrapper captured the startup environment,
not a future method invocation. It should pass `this.userId` explicitly in the
event/job data or create the wrapper inside the invocation. It must not claim
that `bindEnvironment` invents invocation context or changes arrow-function
`this`.
## Case 26: non-Meteor `callAsync` rejection
Prompt: "After migrating to `callAsync`, a client stub throws `TypeError` and
the catch block fails again while reading `error.error`."
Pass if the agent keeps `Meteor.Error` for intentional server-visible failures
but explains that local, misuse, and transport rejections may have another
shape. It must narrow the caught value before reading Meteor-specific fields.
## Case 27: installer alternative
Prompt: "Our Linux setup uses `curl https://install.meteor.com/ | sh`. Must we
replace it because Meteor 3 phased it out?"
Pass if the agent says `npx meteor` is the primary cross-platform command but
curl remains a documented Linux and macOS alternative. It checks the selected
CLI's host Node prerequisite and does not add the installer to project
dependencies.
## Case 28: fresh CLI installation near miss
Prompt: "There is no Meteor application yet. Install the Meteor 3 CLI on this
new Windows workstation and make sure PATH works."
Pass if the agent routes the fresh workstation and PATH workflow to
`meteor-cli-installation`. Fail if it starts an application code migration or
offers the Linux and macOS shell installer on Windows.
@@ -0,0 +1,122 @@
# Iterators with `await`
Naive `Array.prototype.forEach`, `Array.prototype.map`, `Array.prototype.filter`,
and `Array.prototype.find` do **not** make their containing function async
just because the callback is marked `async`. The iterator returns synchronously;
the callback's Promise is discarded.
## `forEach`
```javascript
// BROKEN: returns before any awaited work resolves
items.forEach(async (item) => {
await processItem(item);
});
```
Replace with `for...of`:
```javascript
for (const item of items) {
await processItem(item);
}
```
This runs the items serially. If order does not matter and you want
concurrency, use `Promise.all`:
```javascript
await Promise.all(items.map((item) => processItem(item)));
```
## `map`
```javascript
// BROKEN: result is an array of Promises, not values
const ids = users.map(async (u) => await Users.insertAsync(u));
```
Two correct shapes:
```javascript
// concurrent
const ids = await Promise.all(
users.map((u) => Users.insertAsync(u)),
);
// serial
const ids = [];
for (const u of users) {
ids.push(await Users.insertAsync(u));
}
```
For large arrays, prefer the serial form to avoid hammering Mongo with N
parallel writes.
## `filter`
`Array.prototype.filter` cannot be awaited. Two patterns:
```javascript
// concurrent then prune
const checks = await Promise.all(
items.map(async (it) => ({ it, keep: await predicate(it) })),
);
const kept = checks.filter((c) => c.keep).map((c) => c.it);
// serial
const kept = [];
for (const it of items) {
if (await predicate(it)) kept.push(it);
}
```
## `find`
```javascript
// BROKEN
const hit = items.find(async (it) => await match(it));
```
Replace with `for...of`:
```javascript
let hit;
for (const it of items) {
if (await match(it)) {
hit = it;
break;
}
}
```
## `reduce`
Reduce with an async callback usually wants an accumulator that is itself
a Promise:
```javascript
// serial reduce
const sum = await items.reduce(async (accP, item) => {
const acc = await accP;
return acc + await score(item);
}, Promise.resolve(0));
```
For readability, prefer `for...of` with an explicit accumulator.
## Cursor methods are different
Meteor cursor iterators on the server already have async siblings. Use
those instead of converting a `cursor.fetch()` array to a Promise loop:
```javascript
await cursor.forEachAsync(async (doc) => { /* ... */ });
const mapped = await cursor.mapAsync(async (doc) => { /* ... */ });
```
These properly await each callback.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/migrating-to-async-in-v2/index.md
@@ -0,0 +1,119 @@
# Module system, strict mode, implicit globals
Meteor 3 enforces ES module semantics on every file that uses `import`,
`export`, or top-level `await`. Strict mode is the default. Implicit
file-scoped globals (assignment without `var` / `let` / `const`) no longer
become visible to other files. Apps that relied on the pre-1.7 eager-loading
behavior surface a lot of `ReferenceError: X is not defined` at startup.
## The implicit-global pattern
Pre-3 Meteor allowed:
```javascript
// pre-3: visible to every file that loaded later
PostsShowController = RouteController.extend({ /* ... */ });
Search = { query: function () { /* ... */ } };
SearchResults = function (params) { /* ... */ };
```
After the upgrade, every line above throws `ReferenceError` at runtime.
## The fix
For file-local symbols, declare with `const` / `let`:
```javascript
const PostsShowController = RouteController.extend({ /* ... */ });
const Search = { query: async function () { /* ... */ } };
```
For symbols shared across files, export and import:
```javascript
// lib/search-results.js
export function SearchResults(params) { /* ... */ }
// client/main.js
import { SearchResults } from '../lib/search-results';
```
## Finding the offenders
Grep for assignments at the start of a line that start with a capital letter
and have no declaration:
```bash
grep -nE '^[A-Z][A-Za-z0-9_]+ = ' -- 'client/**/*.js' 'lib/**/*.js' 'server/**/*.js'
```
Every hit either becomes a `const` or moves to `export`. Iterate
fix-restart-fix until the server boots cleanly.
## Explicit import trees
Meteor's standard bundler retains backward-compatible eager loading when an
app has no `meteor.mainModule`. Explicit entry points are recommended because
they make load order and dependencies deterministic. They are required when
the app adopts the Rspack integration, which does not auto-discover an entry.
With `mainModule`, `client/main.js` must import every Blaze `.html` template
and every helper or event file it needs:
```javascript
// client/main.js
import './main.import.less';
import './views/application/layout.html';
import './views/application/layout.js';
import './views/posts/show.html';
import './views/posts/show.js';
import '../lib/router.js';
import '../lib/collections/posts.js';
```
Symptoms of a missed import:
- `{{> myTemplate}}` renders nothing. The template was never registered.
- Template helpers and event handlers do not fire. The `.js` file was not
loaded.
- The console logs `Template.X is not defined`.
## The Iron Router controller trap
Iron Router auto-discovers controllers by name: `route('postsShow', ...)`
looks for a global called `PostsShowController`. In Meteor 3 that global
does not exist; `const PostsShowController = ...` is module-scoped. The
route still renders its template, but `onBeforeAction`, `waitOn`, and
`data` never run. Subscriptions never fire. Minimongo stays empty. There
is no error.
Fix every route definition:
```javascript
// broken in Meteor 3: relies on global lookup
this.route('postsShow', {
path: '/posts/:slug',
});
// works: explicit controller reference
this.route('postsShow', {
path: '/posts/:slug',
controller: PostsShowController,
});
```
Do not rely on Iron Router's naming convention in Meteor 3 at all. Pass
`controller:` on every route that has one.
## Strict mode side effects
- Assignment to an undeclared variable throws. No more "oops, typo".
- `arguments.callee` is not available.
- Duplicate parameter names throw.
- Octal literals (`010`) throw. Use `0o10`.
- `with` is disallowed.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/api/global-variables.md
@@ -0,0 +1,202 @@
# Other breaking changes
Smaller breaking changes from the Meteor 3 upgrade that do not warrant
their own reference but still bite. Skim this once after the framework
flip; come back when a specific symptom matches.
## `Meteor.EnvironmentVariable.withValue` placement
Affects package authors that wrap `Meteor.publish`, `Meteor.methods`, or other
Meteor primitives to propagate dynamic context into a handler. In Meteor 3,
`withValue` uses `AsyncLocalStorage.run`; its context follows the callback's
Promise through `await`.
When patching `Meteor.publish`, place `withValue` at the wrapper's top level
around the call to the original `publish`. Do not introduce that scope inside
the invoked publication handler. Meteor establishes its own publication
invocation context before calling the handler, and the nested placement broke
packages that needed `Meteor.userId()` or another invocation value.
Wrong: introducing `withValue` inside the invoked handler:
```javascript
function patchPublish(publish) {
return function (name, func, ...args) {
return publish.call(this, name, function (...handlerArgs) {
return _publishConnectionId.withValue(this?.connection?.id, () =>
func.apply(this, handlerArgs)
);
}, ...args);
};
}
```
Right: scope the complete patched registration flow and return its result:
```javascript
function patchPublish(publish) {
return function (name, func, ...args) {
return _publishConnectionId.withValue(this?.connection?.id, () =>
publish.call(this, name, function (...handlerArgs) {
return func.apply(this, handlerArgs);
}, ...args)
);
};
}
```
Regression-test the invoked publication before and after an `await`. Its
`Meteor.userId()` or `DDP._CurrentPublicationInvocation` value must remain
consistent with the handler's `this.userId`. A direct `EnvironmentVariable`
test should likewise read the scoped value on both sides of an `await`.
## Mongo driver 6.x: callbacks removed on `rawCollection`
Meteor 3 ships MongoDB Node driver 6.x. The driver removed callback-style
overloads for every async operation. If your code drops to `rawCollection`
or `rawDatabase` for native driver access, rewrite the call sites:
```javascript
// Meteor 2.x: callback
Posts.rawCollection().findOne({ _id }, (err, doc) => { /* ... */ });
// Meteor 3.x: promise
const doc = await Posts.rawCollection().findOne({ _id });
```
The same applies to `rawCollection().aggregate(...).toArray(cb)`,
`insertOne(doc, cb)`, `bulkWrite(ops, cb)`, etc. If a third-party package
still passes a callback into a driver call, fork and rewrite.
## CLI changes
### `--vue2` flag removed
`meteor create --vue2` no longer exists. Vue 2 reached end of life in
December 2023. For Vue, use `meteor create --vue` (Vue 3).
### `meteor reset` no longer wipes Mongo by default
`meteor reset` now clears only the local build cache. The local MongoDB
data survives. To also wipe the database (the Meteor 2.x default), pass
`--db`:
```bash
meteor reset # clears build cache only
meteor reset --db # clears build cache AND local Mongo
```
Update any CI or development scripts that rely on `meteor reset` wiping
the database.
## Release-specific Node baseline
Meteor 3 does not have one Node baseline across every minor release:
| Meteor release | Bundled Node |
|----------------|--------------|
| 3.0 | Node 20 |
| 3.1 through 3.4 | Node 22 |
| 3.5+ | Node 24 |
Run `meteor node --version` in the target app and use that version in CI,
native dependency builds, and container images. Audit `engines.node` and
native packages whenever the target Meteor release changes Node major.
## "Cannot enlarge memory array" during `meteor update`
Running `meteor update --release=3.x` directly from a heavy 2.x project
sometimes crashes with:
```
MINISAT-out: Cannot enlarge memory arrays.
abort() at Error
```
The version-constraint solver (`minisat`) runs out of memory while
resolving the upgrade against a large `.meteor/packages` file. The fix
is to reduce the package surface before the upgrade:
1. Remove every Atmosphere package the app no longer uses.
2. Update or fork remaining packages to declare
`api.versionsFrom(['2.x', '3.0'])` so the solver has fewer
alternatives to consider.
3. Retry the upgrade. If it still fails, comment out non-core packages
in `.meteor/packages`, upgrade, then re-add them one by one.
This is the same root cause as "the install just hangs forever" reports.
## `Meteor.bindEnvironment` for external callbacks
`Meteor.bindEnvironment` captures Meteor dynamic-variable values at the moment
the wrapper is created and restores those values when the callback later runs.
It does not discover the identity of a future method or publication
invocation, and it does not change JavaScript's `this` binding.
Create the wrapper inside the invocation whose environment must be preserved.
For identity, capture `this.userId` explicitly so a long-lived callback does
not depend on implicit request context:
```javascript
import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
Meteor.methods({
startImport(jobId) {
check(jobId, String);
if (!this.userId) throw new Meteor.Error('not-authorized');
const userId = this.userId;
externalSdk.once(jobId, Meteor.bindEnvironment(async (payload) => {
await Posts.insertAsync({ payload, createdBy: userId });
}));
},
});
```
A wrapper created by top-level registration captures the top-level
environment, which normally has no user invocation. For a global event emitter
or background queue, put the authenticated identity in the job or event data
and pass it explicitly. Use `bindEnvironment` only for dynamic variables that
exist when the callback is registered.
## Monkey-patching from `Meteor.startup()`
Code that monkey-patches a Meteor API (intercepting `Meteor.publish`,
wrapping `Accounts.createUser`, etc.) must run after the API is loaded.
On 3.x, package load order is less forgiving than on 2.x; patches at the
top of a file may fire before the target API exists.
Wrap the patch in `Meteor.startup`:
```javascript
import { Meteor } from 'meteor/meteor';
Meteor.startup(() => {
const original = Meteor.publish;
Meteor.publish = function (name, handler, ...rest) {
return original.call(this, name, async function (...args) {
// patched behavior
return handler.apply(this, args);
}, ...rest);
};
});
```
Symptom: the patch is in the codebase but the wrapped behavior never
runs. The patch fired before the target API loaded, so `Meteor.publish`
was `undefined` at patch time and the assignment was a no-op.
## NPM installer
Use `npx meteor` as the primary cross-platform command. The documented
`curl https://install.meteor.com/ | sh` command remains an alternative for
Linux and macOS; do not describe it as phased out. Do not add the npm Meteor
installer to the application's `package.json`.
Match the host Node prerequisite to the selected CLI version. Current Meteor
3.5 installation docs require Node 24+, while earlier Meteor 3 tool releases
bundle earlier Node majors as shown above.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/breaking-changes/index.md
@@ -0,0 +1,136 @@
# Atmosphere package triage
Atmosphere packages are the largest single source of friction in a 2.x to
3.x migration. Many are unmaintained, depend on Fibers, or pin
`api.versionsFrom('1.x')`. Decide for every package: replace, fork, or remove.
## Triage matrix
| Situation | Action |
|--------------------------------------------------------------|-------------------------------------------------------------------|
| Maintained package with a 3.x-compatible release | Update. |
| Maintained package, no 3.x release yet | Open an issue. Track on the project tracker. |
| Unmaintained package, npm replacement exists | Replace. Move the call sites to the npm API. |
| Unmaintained package, no replacement, source available | Fork. Apply minimal changes to ship on 3.x. |
| Unmaintained package, no replacement, you do not need it | Remove. Inline the small piece you depended on. |
## Before the framework upgrade
1. Save `.meteor/packages`, `.meteor/versions`, `package.json`, and the npm
lockfile as a resolution checkpoint.
2. Inventory `.meteor/packages`. List every non-core package.
3. Look up each on Packosphere or its GitHub repo. Note the latest version
and whether it ships a 3.x release.
4. For packages with no 3.x release, search community forks. Several
ecosystem groups maintain community forks of common Atmosphere packages.
5. For packages still missing, decide replace vs fork vs remove now,
before the framework flip.
Review the resolved version diff after every package operation. Keep critical
schema, accounts, router, collection-hook, and build-plugin major upgrades in
separate commits when possible. If behavior changes after the release flip,
first determine whether the responsible package version changed too.
Reducing the package footprint **before** running `meteor update --release=3`
is the single biggest predictor of a smooth upgrade.
## Resolve a stable target completely
When moving from a prerelease to a stable target, compare declarations in
`.meteor/release`, `.meteor/packages`, and `package.json` with resolved versions
in `.meteor/versions` and the npm lockfile. Remove only unintended resolved
prereleases. Keep one only for a documented capability absent from the stable
target. Run `meteor update --npm` when supported and verify a clean locked
install does not change manifests or silently restore a prerelease. Do not fold
unrelated dependency major upgrades into this cleanup.
## Forking a package
```bash
# clone the source somewhere
git clone <repo-url> lib/<package-name>
cd lib/<package-name>
git checkout -b migrate-to-meteor-3
# link from your app's packages/ folder
cd /path/to/app/packages
ln -sf ../lib/<package-name>/path/to/package <package-name>
```
Inside the cloned package, edit `package.js`:
```javascript
Package.describe({
name: '<package-name>',
version: '<bump>',
/* ... */
});
Package.onUse(function (api) {
api.versionsFrom(['2.x', '3.0']); // dual-version
api.use([
'ecmascript',
'mongo@1.16.0 || 2.0.0', // multi-version refs
/* ... */
]);
api.mainModule('main.js'); // optional modular entry point
});
```
Common edits inside the package code:
- Server-side sync Mongo: rewrite to `*Async`.
- `Meteor._sleepForMs` and Fibers helpers: rewrite to native async.
- Implicit globals at file top level: convert to `const` or `export`.
## Package API decisions
`api.addFiles`, `api.export`, and `api.mainModule` all remain supported in
Meteor 3. Do not convert a package only to satisfy the framework version.
Choose `api.mainModule` when the package benefits from an explicit import
tree and module exports. Retain `api.addFiles` for ordered or build-plugin
sources and `api.export` when consumers still rely on package globals.
Actual migration replacements include:
| Removed or changed in 3.x | Replacement |
|---------------------------|------------------------------------|
| `_ensureIndex` | `createIndexAsync` on the server |
| `HTTP.get` | `meteor/fetch` or native `fetch` |
| Sync Mongo methods | `*Async` siblings on the server |
## Custom validators in package methods
Schemas validators that pre-3 packages bundled often need an upgrade for
breaking changes in major versions (typically array shorthand and decimal
options). Keep the schema definitions next to the collection definitions
so a single audit pass covers them.
## Known replacements
Common Atmosphere packages that have a community-blessed 3.x successor:
| Was | Replace with |
|-------------------------------------|----------------------------------------------------|
| `kadira:flow-router` | `ostrio:flow-router-extra` |
| `percolate:synced-cron` | `quave:synced-cron` |
| `aldeed:collection2` (1.x/2.x) | `aldeed:collection2@4.0.0` (bundles `aldeed:simple-schema`; drop the npm `simpl-schema` dep) |
| `mquandalle:jade` | Removed. Migrate templates to Blaze HTML or another templating package. |
| `simple:json-routes` / Restivus | `WebApp.handlers` with Express routes (see `webapp-express.md`). |
| `tmeasday:publish-counts` | `compat:publish-counts` (community fork) |
| `meteor/http` (`HTTP.get`/`post`) | `meteor/fetch` or native `fetch` |
| `underscore` (Atmosphere) | Native ES `Array` / `Object` methods, or the npm `underscore` if you really need it. |
This is a starting set, not exhaustive. For any package not listed,
search the community fork organizations or Packosphere before forking
yourself.
## When to publish back
If the original package is dormant, publish your fork under a different
publisher prefix (the community convention is the org name plus
the original short name). Submit a pull request to the original repo as
well; sometimes the maintainer re-engages.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/guide/package-replacements.md
@@ -0,0 +1,167 @@
# Publications and cursor internals
Most publish functions return a cursor and Meteor handles the rest. Apps
that grew on Meteor 2.x sometimes drove publications imperatively with
`this.added` / `this.changed` / `this.removed`, often dipping into the
cursor's internal `_cursorDescription` for the collection name. That
internal API is unreliable on Meteor 3 and may return `undefined`,
silently breaking the publication.
## Prefer returning a cursor
Whenever the publication can be expressed as a single filtered cursor,
return it. Meteor wires up `added` / `changed` / `removed` automatically:
```javascript
Meteor.publish('posts.recent', function (limit) {
return Posts.find({}, { limit, sort: { createdAt: -1 } });
});
```
Meteor 3 supports both conventional and async publish handlers. Await setup
work, then return a cursor or array of cursors:
```javascript
Meteor.publish('posts.byTeam', async function (teamId) {
const membership = await Memberships.findOneAsync({
teamId,
userId: this.userId,
});
if (!membership) return this.ready();
return Posts.find({ teamId });
});
```
Meteor awaits the handler Promise before processing the returned cursor.
Use the low-level API only when the result cannot be expressed as a returned
cursor, such as per-document async joins or a custom external data source.
## Preserve framework-bound `this`
Meteor invokes method and publication handlers with an invocation context.
Arrow functions ignore that binding, so an arrow that reads `this.userId`,
`this.connection`, `this.ready()`, `this.added()`, or another context member is
incorrect even when its body is otherwise async-compatible.
Before changing handlers, use an AST scan to find:
- an arrow passed directly to `Meteor.publish`;
- an arrow-valued property in an object passed to `Meteor.methods`;
- a `ThisExpression` owned by that outer arrow.
Change only the context-owning handler to an ordinary function:
```javascript
Meteor.publish('items.mine', function () {
if (!this.userId) return this.ready();
return Items.find({ ownerId: this.userId });
});
Meteor.methods({
async 'items.create'(input) {
return Items.insertAsync({ ...input, ownerId: this.userId });
},
});
```
Do not rewrite an arrow that never uses framework context merely because it is
a handler. Preserve nested arrows inside an ordinary handler when they
intentionally capture the handler's `this`. Validate one authenticated and one
unauthenticated call or subscription so the test proves the bound context, not
only compilation.
## Avoid `_cursorDescription`
The internal pattern:
```javascript
// fragile in Meteor 3
async function publishNonReactively(sub, cursor) {
await cursor.forEachAsync((doc) => {
sub.added(cursor._cursorDescription.collectionName, doc._id, doc);
});
sub.ready();
}
```
`_cursorDescription.collectionName` is internal and not guaranteed.
Pass the collection name explicitly instead:
```javascript
async function publishNonReactively(sub, collectionName, ...cursors) {
for (const cursor of cursors) {
await cursor.forEachAsync((doc) => {
sub.added(collectionName, doc._id, doc);
});
}
sub.ready();
}
// usage:
Meteor.publish('posts.featured', function () {
return publishNonReactively(this, 'posts', Posts.find({ featured: true }));
});
```
Or, better, return the cursor and let Meteor handle the wiring.
## Cursor transforms must be sync
A cursor `transform` runs on every document. In Meteor 3 it must be
synchronous:
```javascript
// BROKEN: async transform
Posts.find({}, {
transform: async (doc) => {
doc.author = await Users.findOneAsync(doc.authorId);
return doc;
},
});
```
Produces Promise-shaped documents or publication/serialization failures.
Two options:
1. Keep the transform synchronous. Run the join in a separate publication
or on the client.
2. Drop to the low-level publish API and join inside an
`observeChangesAsync` handler.
## Low-level publish API
```javascript
Meteor.publish('feed', async function () {
const handle = await Posts.find().observeChangesAsync({
added: (id, doc) => this.added('posts', id, doc),
changed: (id, doc) => this.changed('posts', id, doc),
removed: (id) => this.removed('posts', id),
});
this.ready();
this.onStop(() => handle.stop());
});
```
Always stop an `observeChangesAsync` handle from `this.onStop`. Without the
teardown, the observer leaks.
## Authorization
Filter inside the publish body. The publish function is the only chokepoint
that runs before data leaves the server:
```javascript
Meteor.publish('items.mine', function () {
if (!this.userId) return this.ready();
return Items.find(
{ ownerId: this.userId },
{ fields: { title: 1, qty: 1 } },
);
});
```
Project `fields` whenever the collection contains columns the subscriber
must not receive.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/api/meteor.md
@@ -0,0 +1,97 @@
# React migration
Tight scope: what changes for an existing React-on-Meteor-2 app during
the upgrade to Meteor 3. The broader React-on-Meteor data tutorial
(`react-meteor-data`, full hook reference, suspense patterns for new
apps) is out of scope here; use the `meteor-react` skill after the
framework upgrade.
## What changes
`react-meteor-data` is independently versioned. Suspense hooks began in package
2.7.0, before Meteor 3, while package 3.0.0 began official Meteor 3
compatibility. Inspect `.meteor/versions` before choosing an API. For a Meteor
3 app, use a tested 3.0.0+ package; current examples are verified against
4.0.1. The Suspense variants replace the `isLoading` readiness function by
suspending the component tree until data is ready.
```javascript
// Classic surface, supported on Meteor 2 and 3
import { useTracker, useSubscribe } from 'meteor/react-meteor-data';
function PostsScreen() {
const isLoading = useSubscribe('posts');
const posts = useTracker(() => Posts.find().fetch());
if (isLoading()) return <Spinner />;
return <List posts={posts} />;
}
```
```javascript
// Suspense surface, react-meteor-data 2.7.0+; use 3.0.0+ with Meteor 3
import { useTracker, useSubscribe } from 'meteor/react-meteor-data/suspense';
function PostsScreen() {
useSubscribe('posts'); // suspends
const posts = useTracker('posts', () => Posts.find().fetchAsync());
return <List posts={posts} />; // no isLoading()
}
```
Two concrete changes:
1. Import from `meteor/react-meteor-data/suspense` instead of
`meteor/react-meteor-data` when you want Suspense semantics. Wrap the
component in `<Suspense fallback={...}>` somewhere upstream.
2. `useTracker(key, fn)` takes a string key as the first argument under
the suspense API. The key isolates the computation; passing the same
key with a different `fn` is undefined.
The classic `useTracker(fn)` and `useSubscribe(...)` (returning
`isLoading`) keep working under the non-suspense import path. Migration
is optional.
## `useFind`
Classic `useFind` is unchanged. Continue passing a cursor factory:
```javascript
const posts = useFind(() => Posts.find({}));
```
Suspense `useFind` has a different signature. Pass the collection and the
argument tuple for `Collection.find`:
```javascript
const posts = useFind(Posts, [{}, { sort: { createdAt: -1 } }]);
```
Use `meteor-react` for the complete classic and Suspense contracts.
## Client-side Mongo
React components that call `Collection.find().fetch()` directly on the
client work the same way as in Meteor 2. Minimongo on the client is still
synchronous, so keeping render-path reads synchronous is usually simplest.
Async client reads do not inherently lose Tracker reactivity: a reactive read
before the first `await` is tracked. If the reactive read itself occurs after
an `await`, restore the captured computation around that read with
`Tracker.withComputation`. See `client-reactivity.md`.
## Symptoms
- After the upgrade, a `useSubscribe` call no longer returns an
`isLoading` function. The component was migrated to the suspense
import without a wrapping `<Suspense>`. Either add a Suspense
boundary, or import from `meteor/react-meteor-data` (non-suspense).
- `useTracker` reruns on every render or never reruns. The key argument
is missing under the suspense API. Add a stable string key.
- The Suspense import cannot be resolved. Inspect `.meteor/versions`; upgrade
`react-meteor-data` to a Meteor 3-compatible 3.0.0+ line before copying the
current API.
Package version evidence:
[`react-meteor-data` changelog](https://github.com/meteor/react-packages/blob/master/packages/react-meteor-data/CHANGELOG.md)
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/front-end/react.md
@@ -0,0 +1,79 @@
# Functions removed in Meteor 3.x
Meteor 3 removed the synchronous Mongo APIs on the server and the
Fibers-dependent helpers. This is the canonical replacement list.
## Mongo collections (server)
| Removed | Replacement |
|-------------------------------|----------------------------------------------|
| `Collection.find(q).fetch()` | `await Collection.find(q).fetchAsync()` |
| `Collection.findOne(q)` | `await Collection.findOneAsync(q)` |
| `Collection.insert(doc)` | `await Collection.insertAsync(doc)` |
| `Collection.update(q, mod)` | `await Collection.updateAsync(q, mod)` |
| `Collection.remove(q)` | `await Collection.removeAsync(q)` |
| `Collection.upsert(q, mod)` | `await Collection.upsertAsync(q, mod)` |
| `cursor.count()` (server) | `await cursor.countAsync()` |
| `cursor.forEach(fn)` (server) | `await cursor.forEachAsync(fn)` |
| `cursor.map(fn)` (server) | `await cursor.mapAsync(fn)` |
Client-side Minimongo retains the synchronous API.
## User helpers
| Removed | Replacement |
|--------------------------|----------------------------|
| `Meteor.user()` (server) | `await Meteor.userAsync()` |
`Meteor.userId()` was not replaced with an async API. It remains synchronous
inside a method or publication and reads the current invocation. Prefer
`this.userId` there for explicit context. Outside those invocation scopes,
pass the user ID into the async function; `Meteor.userIdAsync()` does not
exist.
## Accounts
Server administration APIs that lost synchronous forms:
| Removed | Replacement |
|--------------------------------------|-----------------------------------------------|
| `Accounts.setPassword(uid, p, opts)` | `await Accounts.setPasswordAsync(uid, p, opts)` |
| `Accounts.addEmail(uid, addr)` | `await Accounts.addEmailAsync(uid, addr)` |
Use `await Accounts.createUserAsync(options)` for explicit server-side user
creation. Do not apply this table to client login flows:
- Client `Accounts.createUser(options, callback)` remains supported, and
`Accounts.createUserAsync(options)` is also available.
- Client `Accounts.changePassword(old, next, callback)` remains
callback-shaped.
- `Meteor.loginWithPassword(user, password, callback)` remains supported.
`Meteor.loginWithPasswordAsync` was added in Meteor 3.5.
## Email
| Removed | Replacement |
|--------------------------|--------------------------------------|
| `Email.send(options)` | `await Email.sendAsync(options)` |
## Assets
| Removed | Replacement |
|----------------------------|----------------------------------------|
| `Assets.getText(path)` | `await Assets.getTextAsync(path)` |
| `Assets.getBinary(path)` | `await Assets.getBinaryAsync(path)` |
## Mongo index management
| Removed | Replacement |
|----------------------------------------|---------------------------------------------|
| `Collection._ensureIndex(spec, opts?)` | `await Collection.createIndexAsync(spec, opts?)` |
## Fibers helpers
- `Meteor._sleepForMs`: removed. Use `await new Promise(r => setTimeout(r, ms))`.
- `Meteor.wrapAsync`: removed. Use the underlying async API directly.
- `Future` (from `fibers/future`): removed. The package no longer ships.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/api/removed-functions.md
@@ -0,0 +1,63 @@
# TypeScript migration
Tight scope: what an existing TypeScript-on-Meteor-2 project must update
during the upgrade to Meteor 3. The full TypeScript-on-Meteor setup
(fresh projects, advanced patterns, type-helper packages) is out of scope
here; a dedicated `meteor-typescript` skill will cover it.
## What breaks
After the upgrade, imports from `meteor/*` resolve to `any` or fail
outright. The Meteor 2 type-shipping mechanism is no longer compatible
with the 3.x build, so any `import { Meteor } from 'meteor/meteor';`
loses its types.
## What to install
```bash
meteor add zodern:types
```
`zodern:types` ships generated `.d.ts` files keyed off your local Meteor
install. It replaces the older approaches used in Meteor 2.
## `tsconfig.json` updates
Two changes are required:
```jsonc
{
"compilerOptions": {
// 1. Resolve symlinks the way Meteor's package layout expects.
"preserveSymlinks": true,
// 2. Map meteor/* imports to the generated types directory.
"baseUrl": "./",
"paths": {
"meteor/*": [".meteor/local/types/packages.d.ts"]
}
}
}
```
Without `preserveSymlinks: true`, TypeScript follows symlinks in
`.meteor/local/build/` and reports duplicate identifier errors. The
`paths` mapping is what tells TypeScript where to find type
declarations for every `meteor/<package>` import.
## After the changes
Restart your TS server (or your editor) so the new `tsconfig.json` is
picked up. The first compilation may be slow because `zodern:types`
regenerates the types directory on demand.
## Symptoms
- `import { Meteor } from 'meteor/meteor';` resolves to `any`, no
autocomplete. The `paths` mapping in `tsconfig.json` is missing.
- "Cannot find module 'meteor/meteor' or its corresponding type
declarations." `zodern:types` is not installed.
- "Duplicate identifier 'Meteor'." `preserveSymlinks` is not set.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/typescript/meteor-types.md
@@ -0,0 +1,114 @@
# WebApp switched to Express 5
Meteor 3 replaced Connect with Express inside the `webapp` package, and
Meteor 3.1 upgraded that to Express 5. Apps that customised the
middleware stack must rename the API surfaces they used and may need to
adjust for Express 5 routing changes. Existing routes that mounted
middleware on `WebApp.connectHandlers` keep working through deprecated
aliases, but new code should use the renamed surfaces.
## API rename matrix
| Meteor 2.x | Meteor 3.x |
|---------------------------------------------|-----------------------------------------|
| `WebApp.connectHandlers.use(mw)` | `WebApp.handlers.use(mw)` |
| `WebApp.rawConnectHandlers.use(mw)` | `WebApp.rawHandlers.use(mw)` |
| `WebApp.connectApp` | `WebApp.expressApp` |
| (no equivalent) | `WebApp.express()` factory |
| (no equivalent) | `WebApp.express.Router()` router |
| (no equivalent) | `WebApp.express.{json,raw,static,text,urlencoded}` |
The old names continue to work as aliases, but are deprecated. New code
should use the renamed surfaces.
## Mounting a route
```javascript
import { WebApp } from 'meteor/webapp';
WebApp.handlers.get('/hello', (req, res) => {
res.send('Hello World');
});
```
Or mount a sub-application:
```javascript
import { WebApp } from 'meteor/webapp';
const app = WebApp.express();
app.get('/hello', (req, res) => res.send('Hello World'));
WebApp.handlers.use(app);
```
## Router-level middleware
```javascript
import { WebApp } from 'meteor/webapp';
const router = WebApp.express.Router();
router.use((req, res, next) => {
// runs on every request through this router
next();
});
router.use('/hello/:name', (req, res, next) => {
console.log('Request URL:', req.originalUrl);
next();
});
WebApp.handlers.use('/', router);
```
## Async `WebAppInternals` methods
Several internal methods that customise the static-asset pipeline became
async in Meteor 3. Add `await` at every call site:
- `await WebAppInternals.reloadClientPrograms()`
- `await WebAppInternals.pauseClient()`
- `await WebAppInternals.generateClientProgram()`
- `await WebAppInternals.generateBoilerplate()`
- `await WebAppInternals.setInlineScriptsAllowed()`
- `await WebAppInternals.enableSubresourceIntegrity()`
- `await WebAppInternals.setBundledJsCssUrlRewriteHook()`
- `await WebAppInternals.setBundledJsCssPrefix()`
- `await WebAppInternals.getBoilerplate()`
## Express 5 specifics (Meteor 3.1+)
Express 5 itself introduces a few changes that bite when upgrading from
Express 4. Meteor 3.0 uses Express 4, so do not apply these routing changes
until the app targets Meteor 3.1+:
- Path matching changed: `*` and unnamed wildcards now require named
parameters (`/foo/*name`). Update any custom path patterns.
- Async route handlers can `throw` or reject and Express forwards the
error to the error middleware. Previously this would crash the process.
- `req.query` is no longer parsed by the deprecated `qs` library by
default; reconfigure if your client relies on bracket notation.
See the Express 5 migration guide if a custom middleware pipeline breaks
after the framework upgrade.
## Backporting
For projects that want to start migrating middleware before the framework
flip, a community backport (`harry97:webapp`) ships an Express-based
`webapp` on Meteor 2.17. Once the project is on 3.x, remove the backport
and use the core `webapp` package.
## Symptoms after the upgrade
- Middleware mounted on `WebApp.connectHandlers` still runs but logs a
deprecation warning. Migrate to `WebApp.handlers` at your convenience.
- On Meteor 3.1+, routes that used unnamed wildcards no longer match. Express
5 path semantics changed; rename to named parameters. Meteor 3.0 retains
Express 4 routing behavior.
- A custom `WebAppInternals` override returns a `Promise` where the
caller expected a value. Add `await`.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/v3-migration-docs/breaking-changes/index.md
+232
View File
@@ -0,0 +1,232 @@
---
name: migrate-to-rspack
description: >
Use when migrating an existing Meteor app to Rspack (Meteor 3.4+), or
upgrading Rspack 1 to 2 on Meteor 3.6 beta. Triggers on nested imports,
mainModule entry points, server-only apps, replacing fourseven:scss /
meteor/less / coffeescript / jorgenvatle:vite / zodern:melte with loaders,
Svelte/TypeScript preprocessing or Lingui SWC plugin failures after upgrade,
CommonJS default-import interop, module.exports in client graphs, Node
built-ins in browser code, _build / build-assets / build-chunks,
.meteorignore hiding handoff files, dynamic chunks under ROOT_URL,
meteor.modules for CSS/HTML, resolve.symlinks or resolve.alias migration,
automatic dependency updates and immutable CI/Docker builds.
Use this skill when the user asks about migration compatibility or a build
plugin's Rspack replacement. For new-app setup and rspack.config.js helpers,
use meteor-modern-build-stack instead.
metadata:
author: meteor
kind: knowledge
meteor: ">=3.4"
area: migration
tagline: "Migrate an existing Meteor 3 app to the Rspack bundler integration (`mainModule`, replacing legacy build plugins with loaders)."
bundle: ["migration"]
docs_synced_at: "2026-09-11"
license: MIT
---
# Migrate an existing app to Rspack
Rspack compiles app code; Meteor builds Atmosphere packages and assembles the
bundle. Keep packages, but audit their architecture and browser dependencies.
Prerequisite: Meteor 3.4+. Recommended before activation: enable
`"meteor": { "modern": true }` and fix Babel fallbacks. For setup and helpers,
use `meteor-modern-build-stack`.
Match `@meteorjs/rspack` to the Meteor release, not to
`@rspack/core` or `@rspack/cli`:
| Meteor | `rspack` | `@meteorjs/rspack` | Capability boundary |
|---|---|---|---|
| 3.4 | `1.0.0` | `1.0.0` | Base integration and helpers. |
| 3.4.1 and 3.5 | `1.1.0` | `2.0.1` | Adds v2 helpers and inherited `TOOL_NODE_FLAGS`. |
| 3.5.1 | `1.2.0` | `2.1.0` | Revised client polyfills and extension discovery. |
| 3.5.2 | `1.3.0` | `2.2.0` | Dependency diagnostics, mode isolation, full-app/TLA and cache fixes. |
| 3.6-beta.0 | `1.4.0-beta360.0` | `3.0.0-beta.1` | Rspack 2.2.0 and workspace-aware installs. |
The Atmosphere, Meteor npm integration, and Rspack core package versions are
independent. Inspect `.meteor/versions`, `package.json`, and the lockfile.
Normal startup aligns required dependencies when automatic installation is
enabled. Review and commit those changes. Explicit `meteor update --npm` is
an alternative, not an extra required step. Do not pair a newer integration
major with an older Meteor release to copy a helper.
Already using Rspack? For the Meteor 3.6 beta upgrade, follow
[Rspack 1 to 2](references/rspack-2-upgrade.md) and its toolchain checks.
Keep valid entries/configuration; skip the first-activation steps below.
## Decision flow
1. Does the app define client and server entry points in `package.json`
`meteor.mainModule`? If no, define them. Required.
2. Trace the client and client-test graphs. Do they reach CommonJS export
assignments, Node built-ins, server-only local package entries, or missing
generated inputs in a clean checkout? If yes, repair the boundary before
activation. See
`references/client-graph-preflight.md`.
3. Does the app code contain nested imports (ES `import` inside an `if`,
function, or other block)? If yes, move them to top level or convert
them to dynamic `import()` / `require`. Required for app code; OK in
Atmosphere packages.
4. Does the app rely on a Meteor build plugin (`less`, `fourseven:scss`,
`coffeescript`, `zodern:melte`, `jorgenvatle:vite`)? Plan an Rspack
loader replacement and prove capability parity before removal. See
`references/framework-and-css.md`.
5. Does the app rely on bare default imports from CommonJS packages
(`import x from "some-cjs"`)? Decide between rewriting to
`import * as x` or restoring Meteor-style interop in `.swcrc`. See
`references/code-migrations.md`.
6. Is the app server-only? Set only `mainModule.server`. Rspack still
bundles the server; client is skipped.
7. Does the app keep CSS or HTML outside its entry folder, or import app-local
symlinks? Preserve the boundary with `meteor.modules` or
`resolve.symlinks: false`; see the references.
8. Run `meteor add rspack` and watch the verbose `[Transpiler]` log for
remaining `(app)` failures.
## Required: entry points
```json
{
"meteor": {
"mainModule": {
"client": "client/main.js",
"server": "server/main.js"
},
"testModule": "tests.js"
}
}
```
Without `mainModule`, Rspack has no entry. Meteor's eager-loading model
does not apply: Rspack does not auto-discover modules. See
`references/framework-and-css.md` for CSS and HTML routing.
## Required: no nested imports in app code
```javascript
// app code: NOT allowed under Rspack
if (condition) {
import { a as b } from "./c";
console.log(b);
}
```
Three fixes:
```javascript
// 1. Move to top
import { a as b } from "./c";
if (condition) console.log(b);
// 2. Dynamic import (standardized, supported)
if (condition) {
const { a: b } = await import("./c");
console.log(b);
}
// 3. require (CommonJS interop)
if (condition) {
const { a: b } = require("./c");
console.log(b);
}
```
Diagnose with verbose mode and look for `(app)` files failing with
`Error: 'import' and 'export' cannot be used outside of module code`.
`(package)` failures are fine; Atmosphere packages are not bundled by Rspack.
## Required: reserve build folders
The integration writes to `_build/`, `public/build-assets/`,
`public/build-chunks/`, `private/build-assets/`. Auto-added to `.gitignore`.
If the project already uses any of these names, rename in `package.json`:
```json
{
"meteor": {
"buildContext": "build",
"assetsContext": "assets",
"chunksContext": "chunks"
}
}
```
Do not edit any file under those folders. Exclude them from IDE indexing and
from every recursive formatter, linter, typechecker, test-discovery, and
coverage scan. `.gitignore` does not configure those tools.
Do not match the active build context in `.meteorignore` or `METEOR_IGNORE`.
Rspack writes Meteor-facing entry modules there, then Meteor reads them to
assemble the final bundle. Resolve renamed contexts before auditing ignores.
## Replacing build plugins
Most app-file build plugins move to Rspack loaders. Prove capability parity
before removal; make conflicting activation and removal one reversible change.
See `references/framework-and-css.md`.
| Old plugin | Replacement |
|---------------------------|----------------------------------------------------------------------|
| `meteor/less` | `less-loader`. See `references/framework-and-css.md`. |
| `fourseven:scss` | `sass-loader` + `sass-embedded`. See refs. Skeleton in `meteor create --full`. |
| `meteor/coffeescript` | `coffee-loader` (optionally chained with `swc-loader`). |
| `zodern:melte` (Svelte) | Official Rspack Svelte loader. |
| `jorgenvatle:vite` (Vue/Solid) | Native Rspack Vue/Solid loaders. |
| `babel-plugin-react-compiler` | SWC on the 3.6 beta pairing; earlier integrations retain Babel. See framework reference. |
| `zodern:types` | Still compatible. Keep it. |
Plugins acting only on Atmosphere package files can stay. Plugins acting on
app-folder files (entry folder excluded) must move to Rspack.
## CommonJS default-import interop
Old Meteor accepted `import x from "some-cjs-lib"` for a `module.exports = ...`
package. Rspack + SWC do not by default. Two options:
```javascript
// preferred: switch to namespace import
import * as x from "some-cjs-lib";
```
Or restore interop in `.swcrc`:
```json
{
"module": {
"type": "commonjs",
"noInterop": false,
"importInterop": "node"
}
}
```
This emits CommonJS, defeating tree-shaking and static analysis app-wide.
Migrate imports instead unless you cannot.
## CI and Docker
Resolve required npm updates locally and commit `package.json` and the lockfile.
Use the existing manager's frozen install with dev dependencies, then build.
On `rspack@1.3.0` (Meteor 3.5.2), `meteor.autoInstallDeps: false` still reports
missing/outdated dependencies and manual commands; earlier opt-out behavior
can skip those checks. Inspect the first dependency/config error and the actual
project root before choosing a fix. See `references/troubleshooting.md`.
## Anti-patterns
- Add Rspack before fixing Babel fallbacks. Find them with
`"meteor": { "modern": { "transpiler": { "verbose": true } } }` and fix
them while still on the optimization-only stack.
- Restore CJS interop globally in `.swcrc` to avoid migrating a handful of
imports. Trades real bundle-size wins for short-term convenience.
- Commit `_build/`, `public/build-assets/`, `public/build-chunks/`,
`private/build-assets/`. Autogenerated.
- Change the release without reviewing its paired dependencies and committing
the authoritative lockfile. Validate a clean install and production build.
## See also
- `references/eval-cases.md`
- For setup, helpers, and `rspack.config.js` API: `meteor-modern-build-stack`.
@@ -0,0 +1,94 @@
# Client graph preflight
Rspack compiles application modules while Meteor still compiles Atmosphere
packages and assembles the final bundle. Audit both systems at the boundaries
that shape the browser graph.
## Build separate reachability graphs
Start from every configured root:
- `meteor.mainModule.client`;
- `meteor.testModule.client`, or the client side of `testModule`;
- client entry points declared by local Atmosphere packages.
Follow static imports, re-exports, and literal `require()` calls. Record dynamic
`import()` edges separately because they are intentional split points. Do not
classify a module only from `client/`, `server/`, or `imports/` in its path.
## Resolve clean-checkout inputs
Resolve every static edge from each client and client-test root in a clean
checkout before activation. A missing module can be:
- a checked-in source file;
- a generated file excluded by Git;
- a virtual module supplied by a loader or plugin;
- an alias resolved by Rspack, TypeScript, Babel, or SWC;
- a package export selected by browser conditions.
Do not require every import target to exist as a physical file. First apply the
active aliases, package exports, extensions, and loader rules. When a target is
generated, find its producer and require a deterministic command before
development, test, CI, and production builds that consume it. Do not commit
generated output automatically. Reproduce from a clean checkout with caches
empty and fail preflight if no documented producer can create the input.
Server unit tests do not prove this graph compiles. Run test-mode client
compilation or a browser-backed client suite, plus a production client build.
## Flag risky client-reachable modules
| Finding | Interpretation | Action |
|---------|----------------|--------|
| `module.exports` or `exports.*` in an ESM graph | Mixed module ownership can abort evaluation or defeat static analysis. | Convert the module consistently to ESM or move it behind a server boundary. |
| Node built-in import | Browser code may be reaching server-only behavior. Rspack does not add Node polyfills automatically. | Move the module server-side or document and configure an intentional browser polyfill. |
| Local package main module has no architecture | Meteor may load server dependencies on the client. | Add the correct `client` or `server` architecture in `package.js`. |
| Meteor package shim writes CommonJS exports | A compatibility shim can become the first failed module in the client chain. | Export valid ESM or keep the shim outside the Rspack client graph. |
Node built-ins to inspect include bare and `node:` forms of `fs`, `path`,
`crypto`, `stream`, `buffer`, `process`, `os`, `child_process`, `net`, `tls`,
`http`, `https`, `zlib`, `vm`, and `worker_threads`.
[Rspack does not automatically polyfill Node built-ins](https://rspack.dev/config/resolve#resolvefallback)
for a web target.
Do not flag these automatically as application defects:
- Rspack config files and Node-only scripts;
- server and server-test graph nodes;
- npm packages with browser exports that remove the built-in edge;
- explicit `resolve.fallback` or polyfill configuration;
- native or worker dependencies intentionally passed to
`Meteor.compileWithMeteor`.
Inspect the resolved graph before editing an indirect dependency.
## Preserve lazy boundaries
Inventory existing `import()` callsites before converting modules. Mark routes,
locales, editors, and other features that must remain lazy. Do not replace those
calls with static imports or synchronous `require()` unless eager loading is an
explicit, measured decision. Compare build chunks before and after migration.
[Rspack treats dynamic `import()` as an async split point](https://rspack.dev/guide/optimization/code-splitting#dynamic-imports).
For deployments beneath a URL path, start a production bundle with the real
`ROOT_URL` shape and request at least one lazy chunk. Reject duplicated or
missing asset path segments.
## Protect Meteor's handoff
Resolve `meteor.buildContext`, `meteor.assetsContext`, and
`meteor.chunksContext`, including any suffix derived from `METEOR_LOCAL_DIR`.
Generated contexts belong in `.gitignore` and in unrelated tool ignores, but
the active build context MUST NOT match `.meteorignore` or `METEOR_IGNORE`.
Rspack writes the Meteor-facing main and test modules there, then Meteor reads
them during final assembly.
Separately compare top-level directory size and file count with `.gitignore`
and `.meteorignore`. Report unrelated repositories, toolchains, generated test
artifacts, caches, or fixtures that Git ignores but Meteor still scans. Use
anchored ignore rules and rerun tests to ensure a broad rule did not hide client
or server test modules.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/modern-build-stack/rspack-bundler-integration.md
@@ -0,0 +1,242 @@
# Code migrations for Rspack
This file covers the app-code changes the integration needs.
## Entry points
```json
{
"meteor": {
"mainModule": {
"client": "client/main.js",
"server": "server/main.js"
},
"testModule": "tests.js"
}
}
```
Required for Rspack; recommended even on Meteor-only. Without it, Meteor
loads every file eagerly and Rspack has nothing to anchor on.
Loading order belongs in the entry file. Imports cascade from there. See
[Modular application structure](https://docs.meteor.com/packages/modules).
### Server-only apps
If the app has no client UI (API servers, microservices, workers), set
only `mainModule.server`:
```json
{
"meteor": {
"mainModule": {
"server": "server/main.js"
}
}
}
```
Rspack builds the server bundle; the client side is skipped.
## Nested imports
Detection: enable verbose mode and watch for `(app)` files failing with
`Error: 'import' and 'export' cannot be used outside of module code`.
```json
"meteor": {
"modern": { "transpiler": { "verbose": true } }
}
```
`(package)` files are out of scope. Atmosphere packages stay on the Meteor
bundler under the integration.
### Rewrites
```javascript
// 1. Top-level
import { a as b } from "./c";
if (condition) console.log(b);
// 2. Dynamic import. Returns a Promise; the function becomes async.
if (condition) {
const { a: b } = await import("./c");
console.log(b);
}
// 3. require
if (condition) {
const { a: b } = require("./c");
console.log(b);
}
```
Use the dynamic-import form when the goal was code-splitting (the original
Meteor nested-import use case). Use `require` for purely synchronous
loading in a sync scope. Inventory intentional `import()` split points before
cleanup and compare generated chunks afterward. Do not silently convert a lazy
boundary into an eager import.
## Default-import interop for CommonJS
Old Meteor accepted `import x from "some-cjs"` for a package whose source
is `module.exports = ...`. Rspack + SWC do not by default.
```javascript
// before
import x from "some-cjs-lib";
// after, preferred
import * as x from "some-cjs-lib";
```
If the upstream package shape makes namespace import wrong (e.g. a single
default export reshaped to namespace), the SWC interop knob restores
Meteor's old behavior:
```json
{
"module": {
"type": "commonjs",
"noInterop": false,
"importInterop": "node"
}
}
```
Cost: SWC emits CommonJS everywhere. Rspack loses ES module boundaries,
so tree-shaking and static analysis are off across the app. Migrate the
handful of imports instead unless there is no alternative.
## Aliases
Three places to keep in sync:
```javascript
// rspack.config.js
const { defineConfig } = require('@meteorjs/rspack');
module.exports = defineConfig(Meteor => ({
resolve: {
alias: {
'@ui': '/imports/ui',
'@api': '/imports/api',
},
},
}));
```
```json
// tsconfig.json (IDE + ESLint)
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@ui/*": ["imports/ui/*"],
"@api/*": ["imports/api/*"]
}
}
}
```
```json
// .swcrc (only if SWC needs to resolve the alias during transpile)
{
"jsc": {
"baseUrl": "./",
"paths": { "@ui/*": ["imports/ui/*"] }
}
}
```
Limits:
- SWC `paths` resolve `import` only, not `require(...)`.
- Rspack `resolve.alias` resolves both `import` and `require`. Prefer
Rspack when both forms are in use.
For dynamic aliases by env, use `swc.config.js` (a function that returns
the SWC config).
## Symlinks and monorepos
Choose resolution from how shared code is consumed:
| Shared-code model | Rspack behavior | Action |
|-------------------|-----------------|--------|
| npm, pnpm, or Yarn workspace package imported by package name | Default package resolution follows the real package. | Keep the default. |
| App-local source symlink imported by its path inside the app | Default resolution follows the real path and can lose the app-local import context. | Set `resolve.symlinks: false`. |
```javascript
module.exports = defineConfig(Meteor => ({
resolve: { symlinks: false },
}));
```
Do not disable symlink resolution for every monorepo. Apply it only when the
application intentionally shares source by symlink location instead of package
name. Validate imports, file watching, a development rebuild, and a production
build from the consumer app.
## Reserved build folders
Do not commit, edit, or import from:
```text
_build/ # Rspack entry + intermediate app code
public/build-assets/ # client static assets
public/build-chunks/ # dynamic-import code splits
private/build-assets/ # server assets
```
Auto-added to `.gitignore` the first time. If the project already uses
these names, rename:
```json
{
"meteor": {
"buildContext": "build",
"assetsContext": "assets",
"chunksContext": "chunks"
}
}
```
`.gitignore` is not a tool ignore. Add the active folder names to every
recursive tool that scans the repository, including Biome or ESLint,
TypeScript, test discovery, coverage, and IDE indexing. Run those tools once
after an Rspack build so generated files cannot hide a missing exclusion.
Do not add the active build context to `.meteorignore` or `METEOR_IGNORE`.
Meteor consumes the Rspack-generated main and test modules from that directory.
See `client-graph-preflight.md` for renamed contexts and source-tree scanning.
## Verifying a migration
Verify from a clean clone, not only from a developer tree with cached files
or ignored settings:
1. The existing manager's frozen install preserves its lockfile: `meteor npm ci`
for npm, root `pnpm install --frozen-lockfile` for pnpm workspaces, or the
installed Yarn version's immutable/frozen command.
2. `"meteor": { "modern": true }` is set and the documented development
command starts with a tracked, nonsecret settings fixture.
3. `meteor add rspack` has produced a committed `rspack.config.*` and the
required npm dependency changes.
4. Verbose mode shows app code running through Rspack/SWC; only Atmosphere
`(package)` files run through the Meteor bundler.
5. Server tests, browser-backed client tests, and the app's E2E command pass.
6. Formatters, linters, typecheckers, and test discovery still pass after
`_build` and asset/chunk folders exist.
7. `meteor build --architecture os.linux.x86_64 /tmp/out` produces a bundle
and no warnings about reserved Rspack config keys.
8. `git status --short` remains clean after the complete sequence.
Then boot the extracted production bundle and load it in a browser. Assert that
the expected test suites executed rather than accepting a compile-only or
zero-test result. Use `validation-matrix.md` for conditional paths such as lazy
chunks, subpath deployment, legacy browsers, and long watch sessions.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/modern-build-stack/rspack-bundler-integration.md
@@ -0,0 +1,359 @@
# Evaluation cases for `migrate-to-rspack`
## Case 1: nested-import diagnosis
Prompt: "After `meteor add rspack`, my build fails with `Error: 'import'
and 'export' cannot be used outside of module code` on `imports/app.js`.
What do I do?"
Pass if the agent identifies a nested import (an ES `import` inside a
conditional, function, or block), explains it is not standard syntax, and
shows the three fixes: move to top, dynamic `import()`, or `require`.
Bonus: mentions verbose mode for finding more `(app)` failures.
## Case 2: SCSS plugin replacement
Prompt: "I use `fourseven:scss` and want to add Rspack. How do I migrate
my SCSS?"
Pass if the agent removes `fourseven:scss` from `.meteor/packages`,
installs `sass-embedded` and `sass-loader`, and adds an SCSS rule to
`rspack.config.js` using `type: 'css/auto'` and the
`api: 'modern-compiler'` option. Bonus: notes that `meteor create --full`
on 3.4.1+ ships this exact setup.
## Case 3: default-import breaks after migration
Prompt: "After enabling Rspack, `import x from "some-cjs-lib"` returns
undefined. The package uses `module.exports = ...`. What changed?"
Pass if the agent explains that Rspack + SWC do not provide the old
Meteor default-import interop, and proposes `import * as x` as the first
fix. If the agent also explains the `.swcrc` `noInterop: false`
workaround, it must call out the tree-shaking cost.
## Case 4: CI cannot find rspack.config.js
Prompt: "Local builds work but Docker fails with `Could not find
rspack.config.js`. What's missing?"
Pass if the agent checks the project root, config file and earlier dependency
errors, treating an incomplete npm upgrade as a hypothesis. It should prefer
resolving required dependencies locally, committing `package.json` and the
lockfile, then using `meteor npm ci` with build-time dev dependencies in Docker.
Fail if it asserts the cause from this error alone or suppresses install errors.
## Case 5: server-only app
Prompt: "I have a background-worker Meteor app with no UI. Can I use
Rspack? How do I configure it?"
Pass if the agent confirms it works, shows a `package.json` with only
`mainModule.server`, and notes that Rspack will skip the client build
entirely.
## Case 6: integration major mismatch
Prompt: "I upgraded from Meteor 3.4 to 3.4.1 but kept
`@meteorjs/rspack@^1.0.0`. The config now fails in a clean build. Should I
align it with my `@rspack/core` major?"
Pass if the agent requires `@meteorjs/rspack` v2 for Meteor 3.4.1, explains
that Meteor 3.4.1 pairs `rspack@1.1.0` with `@meteorjs/rspack@2.0.1`, keeps its
version independent from core/CLI, and uses startup auto-install or explicit
`meteor update --npm` to update and commit the dependency files.
## Case 7: generated files break Biome
Prompt: "The app builds with Rspack, but `biome check .` now reports errors
inside `_build/main-dev`. The directory is already in `.gitignore`."
Pass if the agent explains that Git ignores do not necessarily configure
Biome and adds all active Rspack output folders to the tool's own ignore.
It should rerun Biome after a build.
## Case 8: cached migration passes, clean clone fails
Prompt: "Rspack works in my existing checkout, but a fresh clone cannot
start because an ignored settings file is missing. Is the migration done?"
Pass if the agent rejects the cached-checkout result, requires a tracked
nonsecret settings fixture or documented environment setup, and verifies
development, tests, E2E, production build, and clean Git status from a fresh
clone.
## Case 9: CommonJS assignment in the client graph
Prompt: "After Rspack, every page is blank. A helper imported through a shared
model uses `module.exports`, but the file lives outside `client/`. Server tests
pass. Should I enable global CommonJS interop?"
Pass if the agent traces reachability from the client entry, distinguishes this
from default-import interop, and either converts the reachable module to
consistent ESM or moves it behind a server boundary. Fail if it classifies the
file by pathname or changes `.swcrc` globally without inspecting the graph.
## Case 10: Node built-in enters the browser
Prompt: "The client build now fails on `crypto` and `stream`. The import comes
from a local Atmosphere package whose `api.mainModule('index.js')` contains
server lockout logic."
Pass if the agent inspects the package architecture, restricts the entry to
`server` when appropriate, and verifies a browser production smoke. Accept a
polyfill only when the behavior is intentionally browser-compatible.
## Case 11: `_build` added to `.meteorignore`
Prompt: "I copied generated paths from `.gitignore` into `.meteorignore`. Now
Meteor says it cannot find `_build/main-prod/server-meteor.js`."
Pass if the agent identifies `_build` as the Rspack-to-Meteor handoff, removes
the active build context from `.meteorignore`, checks renamed contexts, and
keeps the path ignored only by Git and unrelated recursive tools.
## Case 12: lazy chunks under a path prefix
Prompt: "The production app works at `/`, but under `ROOT_URL=https://host/app`
opening a lazy route requests `build-chunks/build-chunks/x.js`."
Pass if the agent tests a real dynamic import under the deployed URL prefix,
fixes the public base without making the import static, and verifies that the
chunk loads and executes.
## Case 13: server healthy, browser blank
Prompt: "The Rspack production bundle builds, starts, and returns HTTP 200, but
the browser page is blank. Can I call the migration complete?"
Pass if the agent rejects server health as sufficient, finds the first browser
module exception, inspects the client graph, and requires a browser smoke
against the extracted production bundle.
## Case 14: CSS outside the entry folder
Prompt: "After defining `client/main.js` for Rspack, a global stylesheet in
`styles/main.css` is no longer included. I need Meteor to keep compiling it and
do not want to import it through an Rspack loader."
Pass if the agent adds the stylesheet to `meteor.modules`, does not add
JavaScript there, and verifies the final stylesheet output. Bonus if it explains
that importing through an Rspack loader is the faster-HMR alternative.
## Case 15: app-local source symlink
Prompt: "My Meteor app imports `imports/shared` through a source-directory
symlink. Rspack resolves the real directory outside the app and breaks relative
imports. Should every pnpm workspace set `resolve.symlinks: false`?"
Pass if the agent distinguishes app-local source symlinks from package-name
workspace imports, sets `resolve.symlinks: false` only for the former, and
validates watching and production bundling from the consumer app.
## Case 16: CSS delegation depends on Meteor version
Prompt: "I configured `postcss-loader` while migrating a Meteor 3.4.0 app to
Rspack. Meteor and Rspack both emit the stylesheet. Should I add every generated
folder to `.meteorignore`?"
Pass if the agent identifies automatic stylesheet delegation as Meteor 3.4.1+
behavior, prefers upgrading, and uses only a narrow temporary stylesheet ignore
when 3.4.0 is an intentional constraint. It must protect the active build
context and verify the expected CSS appears exactly once in development and
production.
## Case 17: custom build plugin has hidden behavior
Prompt: "A custom Meteor build plugin compiles `.theme` files, copies fonts in
production, and injects an alias in tests. Rspack has a loader for `.theme`, so
can I remove the plugin now?"
Pass if the agent inventories all three capabilities, configures equivalent
Rspack behavior, and validates development, test, and production outputs before
removal. If the two pipelines conflict, it must use a checkpoint and one
reversible activation/removal change. Fail if it treats the matching extension
as complete parity or upgrades the UI framework unnecessarily.
## Case 18: ignored generated module in the client graph
Prompt: "Server tests pass, but a clean production client build cannot resolve
`./generated/schema.json`. The file is Gitignored and exists on developer
machines after another tool runs. Should I commit it?"
Pass if the agent traces the client and client-test graph, identifies and runs
the deterministic producer before every consuming path, and validates clean
test-mode and production client builds. It must not commit generated output
automatically. Fail if it accepts server tests as client compilation evidence.
## Case 19: successful test command runs no client tests
Prompt: "`meteor test --once` exits zero and reports six server tests, followed
by `browser client tests were not run`. The Rspack changes are client-only. Can
I merge?"
Pass if the agent requires a browser driver or browser-backed client suite,
checks expected suite counts, compiles the real test-mode client entry, and
retains a production browser smoke. Fail if it treats exit zero or server-only
tests as sufficient.
## Case 20: current helper copied into Meteor 3.4.0
Prompt: "A current Rspack example uses `Meteor.persistDevFiles`,
`Meteor.replaceSwcConfig`, and `Meteor.enablePortableBuild`. My migration is
fixed on Meteor 3.4.0. Can I paste those helpers?"
Pass if the agent identifies Meteor 3.4.1 and `@meteorjs/rspack` v2 as the
minimum for all three helpers, checks the resolved Atmosphere and npm package
versions, and either upgrades the paired Meteor integration or designs and
tests direct Rspack equivalents. Fail if it installs v2 alone or assumes
current `devel` helper availability applies to Meteor 3.4.0.
## Case 21: cache panic with valuable local data
Prompt: "Meteor 3.5.2 Rspack exits before its first compile and reports an
incompatible persistent cache. I have valuable data in local Mongo. Give me
the smallest recovery step."
Pass if the agent preserves the first error, stops affected build processes,
resolves and clears only the Rspack cache, and retries. It may escalate to
`meteor reset` only after checking its release behavior. Fail if it deletes
`.meteor/local`, uses `--db`, disables cache permanently, or raises heap limits
without evidence of OOM.
## Case 22: cache recovery on an earlier integration
Prompt: "Our Rspack migration must remain on Meteor 3.4.0. The first compile
hangs after a child-process error. Can I rely on the 3.5.2 fail-fast behavior
and delete .meteor/local to reset it?"
Pass if the agent captures the child error, identifies the later fail-fast fix,
honors the pinned release, and protects local Mongo. It checks reset semantics
or chooses targeted cache recovery only when cache evidence supports it.
## Case 23: upgrade with immutable CI dependencies
Prompt: "We migrated to Meteor 3.5.2 and opted out of npm auto-install. A
clean Docker build lists outdated Rspack dependencies. Prepare the dependency
workflow without letting CI rewrite our lockfile."
Pass if the agent checks the 1.3.0/2.2.0 integration pairing and reported
minimums, resolves and reviews the dependency files locally, preserves runtime
helpers and build-time dev dependencies, and verifies a clean immutable build.
## Case 24: Rspack 2 config migration
Prompt: "Upgrade our Meteor 3.5.2 Rspack app to 3.6-beta.0. Its config uses experiments.css, experiments.cache, output.libraryTarget, webpack-merge, and .swcrc. What must change?"
Pass if the agent: Uses the beta package pairing, removes obsolete CSS experiment, moves cache top-level, reviews library.type while preserving Meteor output, replaces webpack-merge with rspack-merge, and preserves Meteor wrapper .swcrc discovery despite raw Rspack 2 behavior.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 25: npm peer transition warning
Prompt: "On Meteor 3.6-beta.0 autoInstallDeps is false and installed Rspack core/CLI/React Refresh are 1.x. The printed npm update command hits old peer constraints. Should we set legacy-peer-deps globally?"
Pass if the agent: Rejects a global bypass, verifies the coordinated Rspack 2 transition, permits a scoped npm --legacy-peer-deps invocation for confirmed old peers, and notes the beta manual warning may omit the flag. Does not apply the flag to pnpm or Yarn.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 26: preserve an existing Workbox migration
Prompt: "We are moving an existing Meteor app to the 3.6 beta Rspack pairing. It uses a Workbox-generated service worker. Must we discard it for the new Blaze PWA scaffold?"
Pass if the agent: Treats Workbox as optional but valid, inventories generation and cache/update behavior, proves migration parity, and does not overwrite the existing app or promise offline data.
Fail if it contradicts these boundaries or invents unsupported commands.
## Case 27: automatic upgrade of an existing Rspack app
Prompt: "Our existing Meteor 3.5.2 app already uses Rspack and automatic npm installation is enabled. Upgrade to 3.6-beta.0. Must we run meteor update --npm separately, re-add rspack, or regenerate our working config?"
Pass if the agent gives the release update then normal `meteor run`, explains
startup's paired dependency update, and reviews/commits the resulting version
files and authoritative lockfile. It keeps valid entries/configuration and
checks custom tooling separately. Fail if it requires the extra npm command,
re-adds Rspack or promises automatic rewriting of all custom configuration.
## Case 28: beta startup with deliberate auto-install opt-out
Prompt: "We are upgrading our Rspack app to Meteor 3.6-beta.0, but meteor.autoInstallDeps is false and CI must never rewrite dependencies. Will normal startup still upgrade everything? Give the local preparation and CI boundary."
Pass if the agent respects the opt-out, prepares the coordinated dependency
set locally, reviews and commits changes, then uses the existing manager's
frozen install with build-time dev dependencies. It explains that explicit
`meteor update --npm` overrides the opt-out for that invocation. Fail if it
silently enables auto-install, mutates locks in CI or treats opt-out as success
despite unresolved required dependencies.
## Case 29: Svelte preprocessing after the beta upgrade
Prompt: "After upgrading to Meteor 3.6-beta.0/Rspack 2, a Skeleton Svelte component fails during TypeScript preprocessing. We use svelte-loader and svelte-preprocess with PostCSS. Our tsconfig has extends and path aliases. What can we learn from Complex Todos without replacing our build setup?"
Pass if the agent checks resolved compiler/loader/preprocessor versions and
the first error, describes the example's Svelte update and TypeScript dev
dependency/configuration, and merges relevant `target`/`verbatimModuleSyntax`
options while preserving existing settings. It retains needed PostCSS and
verifies an affected component and CSS in development and production. Fail if
it treats observed versions as universal minimums, overwrites the config or
migrates the app to Vite/SvelteKit.
## Case 30: Lingui plugin major differs from the application toolchain
Prompt: "On Meteor 3.6-beta.0 with @rspack/core 2.2.0, our builtin:swc-loader fails loading @lingui/swc-plugin 5.11.0. The other Lingui tools are 5.x. Should I update only @swc/core, remove the plugin, or upgrade every Lingui package to 6? Notes Offline changed the plugin to 6.7.0."
Pass if the agent identifies Rspack's embedded SWC as the relevant host,
checks resolved plugin/runtime compatibility, and treats the example's
plugin update as a candidate rather than a universal pin. It preserves
required macro transforms, explains independently versioned tooling, and
verifies representative transformed and translated output. Fail if any of the
three proposed shortcuts is presented as sufficient without that evidence.
## Case 31: newer example fix on a pinned older compiler
Prompt: "Our Meteor 3.5.2 app must keep Rspack 1 for now. Lingui builds correctly. Should we copy Notes Offline's @lingui/swc-plugin 6.7.0 upgrade to prepare for Meteor 3.6?"
Pass if the agent preserves the working release/integration pairing, rejects
a speculative plugin upgrade and requires compatibility with the actual
resolved compiler before any later change. Fail if it treats the PR's plugin
version as a Meteor-wide floor or silently moves this app to Rspack 2.
## Case 32: raw Rspack 2 advice versus Meteor configuration
Prompt: "The Rspack 2 guide says its packages are pure ESM, dev-server is explicit, and resolve.roots defaults to empty. After upgrading our Meteor app to 3.6-beta.0, should I replace our working CommonJS rspack.config.js with a standalone ESM config and rebuild all resolution rules? Our host CI image still uses Node 18."
Pass if the agent distinguishes host Node from Meteor's build runtime,
checks Rspack 2's supported Node floor, preserves valid Meteor CommonJS
configuration/output and notes that Meteor supplies dev-server and project
roots. It inspects effective configuration and custom overrides before
changing resolution. Fail if it assumes raw defaults replace Meteor's values,
converts the project to ESM unconditionally or ignores the old host runtime.
Also fail if it calls host Node 18 the proven build blocker without checking
whether the command uses Meteor's supported bundled Node instead.
## Case 33: beta feedback without overstating validation
Prompt: "All five examples in PR #50 started, so can we say every plugin and offline/production behavior is verified? My beta app still fails in a custom loader. Help me prepare feedback; do not post anything."
Pass if the agent limits the PR claim to reported migration/startup, requires
the affected feature and applicable production/offline checks, and drafts a
redacted reproduction checklist with releases, resolved toolchain, runtime,
config, command/mode, expected/actual result and first error. It distinguishes
base integration from app tooling without assigning unproven blame. Fail if
it claims tests were run, dismisses all plugin issues as outside Meteor, or
posts a report.
## Case 34: new-app setup is not a migration
Prompt: "I'm creating a new Meteor 3.6-beta.0 app, not upgrading an existing one. I need the initial Rspack setup and an explanation of defineConfig versus extendConfig. Which skill owns this?"
Pass if the agent selects `meteor-modern-build-stack` for setup/configuration
helpers, reserving `migrate-to-rspack` for existing-app migration compatibility.
Fail if it requires a legacy-plugin removal or Rspack 1-to-2 migration first.
## Case 35: a working older plugin on Rspack 2
Prompt: "We use Rspack 2.2.0 and @lingui/swc-plugin 5.11.0. A simple macro compiles and renders correctly. Must we upgrade to 6.7.0 because Notes Offline did? Does our smoke prove its reported failure was wrong?"
Pass if the agent rejects both inferences: it preserves compatible working
tooling without a speculative upgrade and limits the smoke to its actual
input/mode. It requires reproduction through the affected JSX/catalog/loader
path and applicable development/production checks before a broader claim.
Fail if it declares all plugin 5.x versions broken on Rspack 2, forces the
example pin, or dismisses a different project's failure from this one smoke.
@@ -0,0 +1,298 @@
# Framework and CSS migration
Rspack replaces most Meteor build plugins that act on app files. Atmosphere
package internals can keep their old plugin. Framework-specific notes
below; each links to the underlying Rspack guide.
## React
Works out of the box. `meteor add rspack` detects React in
`package.json` and registers `react-refresh` automatically.
Skeleton: `meteor create --react`.
## Preact
Detected the same way as React. When Preact is in `package.json`, Meteor
skips adding React-only dependencies (no `react-refresh`). No extra config.
## React Compiler
On Meteor 3.6-beta.0's Rspack 2.2.0 / `@meteorjs/rspack@3.0.0-beta.1`
pairing, prefer the built-in SWC compiler through `Meteor.extendSwcConfig`.
Use `meteor-react` for React 19 and React 17/18 target/runtime setup.
Earlier integrations retain a Babel loader scoped to `.jsx`/`.tsx`; Babel
also remains valid for options unsupported by SWC. Do not remove a custom
Babel pipeline until its other transforms and runtime behavior are preserved.
See the [Rspack React Compiler guide](https://rspack.rs/guide/tech/react#react-compiler).
## Vue
Native Rspack Vue loader, no `jorgenvatle:vite` needed. Remove
`jorgenvatle:vite` from `package.json` after adding `rspack`.
Skeleton: `meteor create --vue`.
## Solid
Native Rspack Solid loader, no `jorgenvatle:vite` needed.
Skeleton: `meteor create --solid`.
## Svelte
Use the official Rspack Svelte integration. `zodern:melte` does not work
with the integration. If the codebase relied on melte-specific helpers
like `$` or `$m`, replace them with standard Svelte equivalents or
project-local abstractions.
Skeleton: `meteor create --svelte`.
## CoffeeScript
Combine `coffee-loader` with `swc-loader` to keep app code on SWC.
```bash
npm install --save-dev coffeescript swc-loader coffee-loader
```
```javascript
const { defineConfig } = require('@meteorjs/rspack');
module.exports = defineConfig(Meteor => ({
module: {
rules: [
{
test: /\.coffee$/i,
use: [
{ loader: 'swc-loader', options: Meteor.swcConfigOptions },
{ loader: 'coffee-loader' },
],
},
],
},
resolve: { extensions: ['.coffee'] },
}));
```
Skeleton: `meteor create --coffeescript`.
## Angular
Experimental. Builds and runs in dev, prod, and test mode.
Skeleton: `meteor create --angular`.
## Babel as the app transpiler
Rspack supports Babel as an alternative to SWC. Slower. Useful for
Babel-only plugins or compiler requirements unsupported by SWC. If a single
file needs Babel, restrict the loader to that file rather than the whole
app.
Skeleton: `meteor create --babel`.
## CSS and HTML outside the entry folder
Rspack requires JavaScript entry points, but Meteor can keep processing selected
CSS or HTML outside the entry folder. List those paths under `meteor.modules`:
```json
{
"meteor": {
"modules": ["styles/main.css", "imports/shell.html"]
}
}
```
Use this when a Meteor HTML or stylesheet compiler must retain ownership. Do
not add JavaScript expecting Meteor to compile it; Rspack owns app scripts. If
the file can be imported through a configured Rspack loader, prefer that path
for faster HMR. Validate that every listed path exists and that the final HTML
or stylesheet contains its output.
## Replace build plugins by capability
Before removing a Meteor build plugin, identify what it actually provides:
```text
handled extensions and source roots
loader or transform order
development and production branches
generated files and copied assets
injected globals, aliases, or virtual modules
source maps and minification behavior
```
Configure the matching Rspack loaders and plugins before removing the old
owner. Compare representative development and production outputs, including
generated CSS or assets and test-mode compilation. Remove the old plugin only
after output and runtime parity hold. If both owners cannot coexist, checkpoint
the working build and combine activation plus removal in one reversible change.
Revert that change when parity fails instead of stacking unrelated dependency
or framework upgrades.
Do not remove a plugin that acts only on Atmosphere package internals. Rspack
owns app code, while Meteor still compiles Atmosphere packages and assembles
the final bundle.
## CSS (default)
Built in. Any imported CSS file is processed and added to the HTML
skeleton. Any CSS file colocated with the entry point becomes a global
stylesheet without an explicit import.
On Meteor 3.4.1 and later, when `rspack.config.js` declares a CSS rule (via
`postcss-loader`, `type: "css"`, or another CSS loader), Meteor detects the
handled extensions after the first compilation and stops processing those
files. No `.meteorignore` change is required. The same auto-delegation applies
to Less and SCSS once their loaders are configured.
Meteor 3.4.0 predates automatic stylesheet delegation. Prefer upgrading to
3.4.1 or later before migrating the style pipeline. If the app must remain on
3.4.0, use only the narrow ignore required to prevent duplicate compilation,
verify that the exact styles still appear once in development and production,
and remove the workaround immediately after upgrading. Never ignore the active
Rspack build context.
If no CSS rule is present, Meteor keeps handling stylesheets the legacy
way. Meteor 3.6-beta.0's paired integration supplies a `css/auto` rule by
default; inspect the effective rules before diagnosing duplicate CSS owners.
## CSS Modules
Files named `*.module.css` are auto-scoped. Default export style is
named:
```javascript
import { app } from './App.module.css';
```
For default-import style:
```javascript
module.exports = defineConfig(Meteor => ({
module: {
parser: {
'css/auto': { namedExports: false },
'css/module': { namedExports: false },
},
},
}));
```
```javascript
import styles from './App.module.css';
```
TypeScript declaration (e.g. `imports/css-modules.d.ts`):
```typescript
declare module '*.module.css' {
const classes: { readonly [key: string]: string };
export default classes;
}
```
## Less
Replaces the `meteor/less` Meteor plugin for app files.
```bash
npm i -D less less-loader
```
```javascript
module.exports = defineConfig(Meteor => ({
module: {
rules: [
{
test: /\.less$/,
use: [{ loader: 'less-loader' }],
type: 'css/auto',
},
],
},
}));
```
## SCSS
Replaces the `fourseven:scss` Meteor plugin for app files.
```bash
npm i -D sass-embedded sass-loader
```
```javascript
module.exports = defineConfig(Meteor => ({
module: {
rules: [
{
test: /\.scss$/i,
use: [{
loader: 'sass-loader',
options: {
api: 'modern-compiler',
implementation: require.resolve('sass-embedded'),
},
}],
type: 'css/auto',
},
],
},
}));
```
Meteor 3.4.1's `meteor create --full` skeleton ships this exact setup.
## Tailwind and PostCSS
Supported out of the box. Follow the [Rspack Tailwind guide](https://tailwindcss.com/docs/installation/framework-guides/rspack/react).
Skeleton: `meteor create --tailwind`.
## Service Worker
For an existing Workbox integration or a generated worker, use
`workbox-webpack-plugin`'s `GenerateSW`. Meteor 3.6-beta.0 also supplies a
dependency-free Blaze worker via `meteor create --pwa`; use `meteor-blaze`
for that scaffold and preserve an existing worker when migrating. Neither
approach supplies offline data synchronization. For Workbox:
1. `exclude: [/./]` to skip precaching the build output. Use
`runtimeCaching` rules for dynamic bundles.
2. Match HMR with `/\.hot-update\./` and set it to `NetworkOnly`.
3. Cache `Meteor.assetsContext` and `Meteor.chunksContext` paths with
`StaleWhileRevalidate`. They contain build output Meteor serves.
For a custom `sw.js` filename, persist it once to disk in dev:
```javascript
...Meteor.persistDevFiles({ once: ['service-worker.js'] }),
```
HTML files persist automatically.
Service Worker support added in Meteor 3.4.1.
## HTML
A `client/main.html` (or whatever the entry folder uses) is processed by
Meteor's HTML pipeline as before. For deeper customization use the
integration's `HtmlRspackPlugin`:
```javascript
module.exports = defineConfig(Meteor => ({
plugins: [
Meteor.HtmlRspackPlugin({
meta: {
viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no',
},
}),
],
}));
```
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/modern-build-stack/rspack-bundler-integration.md
@@ -0,0 +1,99 @@
# Rspack 1 to 2 in Meteor
Use this branch for Meteor 3.6, verified on `3.6-beta.0`, with
`rspack@1.4.0-beta360.0` and `@meteorjs/rspack@3.0.0-beta.1`.
Meteor 3.5.2 keeps `rspack@1.3.0`, `@meteorjs/rspack@2.2.0` and Rspack 1.x.
Do not force Rspack 2 into a constrained older release.
## Upgrade the coordinated dependency set
1. Checkpoint `.meteor/release`, `.meteor/versions`, app/workspace manifests,
the authoritative lockfile and custom `rspack.config.*`.
2. With default `meteor.autoInstallDeps` enabled, update then start normally:
```bash
meteor update --release 3.6-beta.0
meteor run
```
Startup checks and updates the required Rspack project dependencies. A
separate `meteor update --npm` is unnecessary. Review the resulting
manifests, Meteor version files and lockfile before committing them.
If `meteor.autoInstallDeps: false`, respect that choice: prepare the paired
dependencies explicitly in an authorized local workflow, then commit and
test a frozen install. `meteor update --npm` overrides the opt-out for that
invocation; do not put a lockfile-rewriting step in immutable CI.
3. The beta's required npm minimums are core/CLI/dev-server 2.2.0, Meteor integration
3.0.0-beta.1, SWC core 1.15.32, helpers 0.5.23 and Rsdoctor 1.5.9.
Keep helpers in runtime dependencies, the bundler tools in dev dependencies.
Detected React adds refresh plugin 2.0.0 and refresh runtime 0.17.0.
Record the resolved versions: compatible newer patches can satisfy these
minimums without matching the original examples' lockfiles exactly.
4. With npm and installed Rspack 1.x peers, the automatic upgrade uses
`--legacy-peer-deps`. The beta's manual warning can omit it. If that exact
coordinated update is rejected for stale peers, use the flag for that
invocation, review the lockfile and validate the installed majors. Do not
use `--force`, a global peer bypass or a flag copied into pnpm/Yarn.
5. Keep pnpm/Yarn workspace ownership. Resolve the manager at the workspace
root, add dependencies from the nested Meteor app, and commit its manifest
plus the root lockfile. Preserve intentional local dependency protocols.
## Review app-owned overrides
Meteor composes its base integration configuration and creates a default file
if none exists. It does not rewrite an existing `rspack.config.*` or migrate
every third-party loader/plugin. Inspect the effective merged configuration
before applying raw Rspack advice.
| Existing customization | Action on the beta pairing |
|---|---|
| `experiments.css` | Remove the obsolete option; the integration already supplies CSS rules with `type: "css/auto"`. Test CSS Modules and loader output. |
| `experiments.cache` | Use top-level `cache`; normally retain Meteor's persistent-cache defaults or `Meteor.setCache(false)` for a measured diagnostic. |
| `output.libraryTarget` | The upstream form is `output.library.type`, but Meteor owns final output. Remove an unnecessary override rather than replacing Meteor's output object. |
| `webpack-merge` in app-owned configuration | Use a compatible `rspack-merge` or Meteor's `extendConfig`; install a direct dependency if the app imports it. Preserve nested rules. |
| Missing TypeScript re-export diagnostic | Meteor defaults `module.parser.javascript.exportsPresence` to `"warn"` for SWC-stripped type exports. Inspect a custom strict override and distinguish types from missing runtime exports; do not disable checks globally. |
| `.swcrc`, `swc.config.js`, `swc.config.ts` | Keep valid Meteor configuration: the integration reads it and passes loader options even though raw Rspack 2 no longer auto-loads `.swcrc`. |
| Manual React Refresh plugin/bootstrap | Verify Meteor's automatic injection first; do not introduce a second refresh stack. |
Also check these [upstream migration boundaries](https://www.rspack.dev/guide/migration/rspack_1.x):
| Surface | Migration check |
|---|---|
| Node and ESM | Rspack 2 requires Node `^20.19.0 \|\| >=22.12.0`. Meteor 3.6-beta.0 bundles Node 24.15.0; host Node 18 alone does not prove a Meteor build incompatibility. Identify which binary actually invokes each tool before upgrading that runtime. Keep valid Meteor CommonJS configs/output despite pure-ESM Rspack packages. |
| Dev server | `@rspack/dev-server` is now explicit; Meteor's dependency check supplies it. Review custom `devServer.proxy` and `watchFiles` against the v2 guide before reusing old shapes. |
| Resolution | Upstream changes cover `.wasm` extension lookup, CSS `@import` conditions and empty `resolve.roots`. Meteor supplies explicit extensions and project roots. Inspect `resolve.byDependency` and custom overrides; test the failing import before changing resolution globally. |
| Custom plugins | Review the plugin's Rspack 2 support and the [2.0 breaking-change overview](https://www.rspack.dev/blog/announcing-2-0), including compiler hook and stats API changes when used. |
Apply changes to app-owned overrides, not generated `_build` output or a
replacement standalone configuration. For framework loaders, Svelte
preprocessors and Lingui/SWC plugins, use
[toolchain compatibility](toolchain-compatibility.md).
React Compiler can use the built-in SWC loader on this pairing; see
[framework migration](framework-and-css.md). Retain Babel for an older
integration or requirements unsupported by the SWC compiler path.
## Prove the result
Use `meteor npm ci` for an npm lockfile, `pnpm install --frozen-lockfile` at
the pnpm workspace root, or the installed Yarn version's frozen/immutable
install. Keep dev dependencies in the build stage. If an npm lockfile created
with the transition flag requires it for `ci`, document that project-local
requirement and retest after peer cleanup. Do not convert managers to fix CI.
Run development, a rebuild, actual client/server tests, and a production
bundle. Exercise CSS, lazy imports, local/workspace packages and custom
loaders when present. Boot the extracted bundle and load the browser page.
Follow the [validation matrix](validation-matrix.md); reported example startup
is not proof that your translations, UI components or offline updates work.
For a failure, capture the [migration report](troubleshooting.md#reporting-issues)
before applying another workaround.
On the beta's `rspack` package, HMR bootstrap belongs only to non-native
client development under `meteor run`, outside test mode. A `meteor build`
with `NODE_ENV=development` still has no dev-server HMR runtime. Verify the
generated and final artifacts, then rebuild from source; never repair them by
editing generated bootstrap files. Native HCP is a separate workflow.
---
Source: https://github.com/meteor/meteor/blob/devel/v3-docs/docs/about/modern-build-stack/rspack-bundler-integration.md
Loaded 100 of 1741 files, more files were not shown because too many files have changed in this diff. Show more