{
	"issue": {
		"url": "https://api.github.com/repos/laurent22/joplin/issues/14417",
		"repository_url": "https://api.github.com/repos/laurent22/joplin",
		"labels_url": "https://api.github.com/repos/laurent22/joplin/issues/14417/labels{/name}",
		"comments_url": "https://api.github.com/repos/laurent22/joplin/issues/14417/comments",
		"events_url": "https://api.github.com/repos/laurent22/joplin/issues/14417/events",
		"html_url": "https://github.com/laurent22/joplin/pull/14417",
		"id": 3972875100,
		"node_id": "PR_kwDOBLftOs7FYW_L",
		"number": 14417,
		"title": "Fix/14372 joplin server oauth",
		"user": {
			"login": "mahendra-918",
			"id": 178264708,
			"node_id": "U_kgDOCqAahA",
			"avatar_url": "https://avatars.githubusercontent.com/u/178264708?v=4",
			"gravatar_id": "",
			"url": "https://api.github.com/users/mahendra-918",
			"html_url": "https://github.com/mahendra-918",
			"followers_url": "https://api.github.com/users/mahendra-918/followers",
			"following_url": "https://api.github.com/users/mahendra-918/following{/other_user}",
			"gists_url": "https://api.github.com/users/mahendra-918/gists{/gist_id}",
			"starred_url": "https://api.github.com/users/mahendra-918/starred{/owner}{/repo}",
			"subscriptions_url": "https://api.github.com/users/mahendra-918/subscriptions",
			"organizations_url": "https://api.github.com/users/mahendra-918/orgs",
			"repos_url": "https://api.github.com/users/mahendra-918/repos",
			"events_url": "https://api.github.com/users/mahendra-918/events{/privacy}",
			"received_events_url": "https://api.github.com/users/mahendra-918/received_events",
			"type": "User",
			"user_view_type": "public",
			"site_admin": false
		},
		"labels": [
			{
				"id": 1080341216,
				"node_id": "MDU6TGFiZWwxMDgwMzQxMjE2",
				"url": "https://api.github.com/repos/laurent22/joplin/labels/desktop",
				"name": "desktop",
				"color": "ffc274",
				"default": false,
				"description": "All desktop platforms"
			},
			{
				"id": 1088782694,
				"node_id": "MDU6TGFiZWwxMDg4NzgyNjk0",
				"url": "https://api.github.com/repos/laurent22/joplin/labels/api",
				"name": "api",
				"color": "91ca55",
				"default": false,
				"description": "Joplin API"
			},
			{
				"id": 1095621255,
				"node_id": "MDU6TGFiZWwxMDk1NjIxMjU1",
				"url": "https://api.github.com/repos/laurent22/joplin/labels/cli",
				"name": "cli",
				"color": "ffc274",
				"default": false,
				"description": "CLI app specific issue"
			},
			{
				"id": 2676541710,
				"node_id": "MDU6TGFiZWwyNjc2NTQxNzEw",
				"url": "https://api.github.com/repos/laurent22/joplin/labels/server",
				"name": "server",
				"color": "ffc274",
				"default": false,
				"description": "Issues related to Joplin Server"
			}
		],
		"state": "closed",
		"locked": false,
		"assignees": [],
		"milestone": null,
		"comments": 4,
		"created_at": "2026-02-21T21:34:29Z",
		"updated_at": "2026-02-22T08:47:41Z",
		"closed_at": "2026-02-22T08:47:30Z",
		"assignee": null,
		"author_association": "NONE",
		"active_lock_reason": null,
		"draft": false,
		"pull_request": {
			"url": "https://api.github.com/repos/laurent22/joplin/pulls/14417",
			"html_url": "https://github.com/laurent22/joplin/pull/14417",
			"diff_url": "https://github.com/laurent22/joplin/pull/14417.diff",
			"patch_url": "https://github.com/laurent22/joplin/pull/14417.patch",
			"merged_at": null
		},
		"body": "# Description\r\nThis PR addresses issue #14372 by enabling the OAuth authentication flow for the self-hosted Joplin Server sync target, bringing the login experience on par with Joplin Cloud.\r\n\r\nFollowing the review feedback from PR #14395, this implementation avoids duplicating components. Instead, it makes the existing Joplin Cloud components fully generic for use by both services.\r\n\r\n## Changes Made\r\n- **Unified Login UI:** Refactored [JoplinCloudLoginScreen.tsx](cci:7://file:///Users/roronoazoro/Desktop/open-source/joplin/packages/app-mobile/components/screens/JoplinCloudLoginScreen.tsx:0:0-0:0) to handle generic OAuth parameters including dynamic `syncTargetId` and server URLs.\r\n- **Unified Auth Utils:** Updated `joplinCloudUtils.ts` to dynamically use either `sync.10` (Cloud) or `sync.9` (Server) settings based on the target.\r\n- **Config & Routing:** Updated [Root.tsx](cci:7://file:///Users/roronoazoro/Desktop/open-source/joplin/packages/app-desktop/gui/Root.tsx:0:0-0:0) to route [JoplinServerLogin](cci:1://file:///Users/roronoazoro/Desktop/open-source/joplin/packages/app-desktop/gui/ConfigScreen/ConfigScreen.tsx:261:5-266:7) through the generic screen, and added a \"Login with Joplin Server\" button to [ConfigScreen.tsx](cci:7://file:///Users/roronoazoro/Desktop/open-source/joplin/packages/app-desktop/gui/ConfigScreen/ConfigScreen.tsx:0:0-0:0).\r\n- **Backend Auth Checks:** Modified `SyncTargetJoplinServer.ts` so `isAuthenticated()` verifies the actual session ID.\r\n- **Fixed Stale Closures:** Replaced the `useState` hook with `useRef` for interval management during token polling, addressing previous PR feedback.\r\n\r\n# Testing\r\n- Tested manually by connecting the Desktop app to a local Joplin Server instance (`http://localhost:22300`), verifying the external browser authorization flow and successful provisioning.\r\n- Verified TypeScript compilation and ESLint formatting across all packages.\r\n",
		"closed_by": {
			"login": "laurent22",
			"id": 1285584,
			"node_id": "MDQ6VXNlcjEyODU1ODQ=",
			"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
			"gravatar_id": "",
			"url": "https://api.github.com/users/laurent22",
			"html_url": "https://github.com/laurent22",
			"followers_url": "https://api.github.com/users/laurent22/followers",
			"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
			"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
			"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
			"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
			"organizations_url": "https://api.github.com/users/laurent22/orgs",
			"repos_url": "https://api.github.com/users/laurent22/repos",
			"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
			"received_events_url": "https://api.github.com/users/laurent22/received_events",
			"type": "User",
			"user_view_type": "public",
			"site_admin": false
		},
		"reactions": {
			"url": "https://api.github.com/repos/laurent22/joplin/issues/14417/reactions",
			"total_count": 0,
			"+1": 0,
			"-1": 0,
			"laugh": 0,
			"hooray": 0,
			"confused": 0,
			"heart": 0,
			"rocket": 0,
			"eyes": 0
		},
		"timeline_url": "https://api.github.com/repos/laurent22/joplin/issues/14417/timeline",
		"performed_via_github_app": null,
		"state_reason": null
	},
	"comments": [
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3939542638",
			"html_url": "https://github.com/laurent22/joplin/pull/14417#issuecomment-3939542638",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14417",
			"id": 3939542638,
			"node_id": "IC_kwDOBLftOs7q0KZu",
			"user": {
				"login": "github-actions[bot]",
				"id": 41898282,
				"node_id": "MDM6Qm90NDE4OTgyODI=",
				"avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/github-actions%5Bbot%5D",
				"html_url": "https://github.com/apps/github-actions",
				"followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
				"following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
				"gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
				"organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
				"repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
				"events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
				"received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
				"type": "Bot",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2026-02-21T21:34:41Z",
			"updated_at": "2026-02-22T08:47:41Z",
			"body": "****CLA Assistant Lite bot**** All contributors have signed the CLA  ✍️ ✅",
			"author_association": "CONTRIBUTOR",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3939542638/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": {
				"id": 15368,
				"client_id": "Iv1.05c79e9ad1f6bdfa",
				"slug": "github-actions",
				"node_id": "MDM6QXBwMTUzNjg=",
				"owner": {
					"login": "github",
					"id": 9919,
					"node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=",
					"avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4",
					"gravatar_id": "",
					"url": "https://api.github.com/users/github",
					"html_url": "https://github.com/github",
					"followers_url": "https://api.github.com/users/github/followers",
					"following_url": "https://api.github.com/users/github/following{/other_user}",
					"gists_url": "https://api.github.com/users/github/gists{/gist_id}",
					"starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}",
					"subscriptions_url": "https://api.github.com/users/github/subscriptions",
					"organizations_url": "https://api.github.com/users/github/orgs",
					"repos_url": "https://api.github.com/users/github/repos",
					"events_url": "https://api.github.com/users/github/events{/privacy}",
					"received_events_url": "https://api.github.com/users/github/received_events",
					"type": "Organization",
					"user_view_type": "public",
					"site_admin": false
				},
				"name": "GitHub Actions",
				"description": "Automate your workflow from idea to production",
				"external_url": "https://help.github.com/en/actions",
				"html_url": "https://github.com/apps/github-actions",
				"created_at": "2018-07-30T09:30:17Z",
				"updated_at": "2026-05-05T14:51:38Z",
				"permissions": {
					"actions": "write",
					"administration": "read",
					"artifact_metadata": "write",
					"attestations": "write",
					"checks": "write",
					"code_quality": "write",
					"contents": "write",
					"copilot_requests": "write",
					"deployments": "write",
					"discussions": "write",
					"issues": "write",
					"merge_queues": "write",
					"metadata": "read",
					"models": "read",
					"packages": "write",
					"pages": "write",
					"pull_requests": "write",
					"repository_hooks": "write",
					"repository_projects": "write",
					"security_events": "write",
					"statuses": "write",
					"vulnerability_alerts": "read"
				},
				"events": [
					"branch_protection_rule",
					"check_run",
					"check_suite",
					"create",
					"delete",
					"deployment",
					"deployment_status",
					"discussion",
					"discussion_comment",
					"fork",
					"gollum",
					"issues",
					"issue_comment",
					"label",
					"merge_group",
					"milestone",
					"page_build",
					"public",
					"pull_request",
					"pull_request_review",
					"pull_request_review_comment",
					"push",
					"registry_package",
					"release",
					"repository",
					"repository_dispatch",
					"status",
					"watch",
					"workflow_dispatch",
					"workflow_run"
				]
			}
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3939543223",
			"html_url": "https://github.com/laurent22/joplin/pull/14417#issuecomment-3939543223",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14417",
			"id": 3939543223,
			"node_id": "IC_kwDOBLftOs7q0Ki3",
			"user": {
				"login": "coderabbitai[bot]",
				"id": 136622811,
				"node_id": "BOT_kgDOCCSy2w",
				"avatar_url": "https://avatars.githubusercontent.com/in/347564?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/coderabbitai%5Bbot%5D",
				"html_url": "https://github.com/apps/coderabbitai",
				"followers_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/followers",
				"following_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/following{/other_user}",
				"gists_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/subscriptions",
				"organizations_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/orgs",
				"repos_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/repos",
				"events_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/events{/privacy}",
				"received_events_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/received_events",
				"type": "Bot",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2026-02-21T21:35:09Z",
			"updated_at": "2026-02-21T23:21:58Z",
			"body": "<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\nNo actionable comments were generated in the recent review. 🎉\n\n---\n\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nAdds Joplin Server as a sync target alongside Joplin Cloud: introduces sync target constants, parameterises the cloud login checker to accept a syncTargetId, updates UI/CLI/mobile to support generic sync targets and a Joplin Server login route, improves server session checks, and adds a transcribe prebuild script.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Sync utilities & targets** <br> `packages/lib/services/joplinCloudUtils.ts`, `packages/lib/SyncTargetJoplinServer.ts`|Added `syncTargetIdCloud` (10) and `syncTargetIdServer` (9); `checkIfLoginWasSuccessful` now accepts `syncTargetId` and uses dynamic setting keys; `SyncTargetJoplinServer` gains `authRouteName()` and an explicit `isAuthenticated(): Promise<boolean>` that checks server session via file/API.|\n|**Desktop screens & routing** <br> `packages/app-desktop/gui/JoplinCloudLoginScreen.tsx`, `packages/app-desktop/gui/ConfigScreen/ConfigScreen.tsx`, `packages/app-desktop/gui/Root.tsx`|Login screen refactor to accept `syncTargetId`, `authWebsite`, `authApi`, `serviceName`; interval state replaced with ref; added Joplin Server login route and desktop UI button to trigger server login; minor JSX/formatting tweaks.|\n|**CLI & Mobile callers** <br> `packages/app-cli/app/command-sync.ts`, `packages/app-mobile/components/screens/JoplinCloudLoginScreen.tsx`|Import and pass `syncTargetIdCloud` into `checkIfLoginWasSuccessful()` call sites.|\n|**Joplin Server API surface** <br> `packages/lib/JoplinServerApi.ts`|Renamed and made session retrieval public: `private sessionId()` → `public getSessionId(): Promise<string>`; updated internal call sites.|\n|**Editor IPC / minor typing** <br> `packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/CodeMirror.tsx`, `packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/CodeMirror.tsx`|Whitespace/typing adjustments; when viewer is hidden, emit guarded `noteRenderComplete` IPC in additional render paths; no public API changes.|\n|**Transcribe build helper** <br> `packages/transcribe/package.json`, `packages/transcribe/scripts/prebuild.js`|`tsc` script now runs `node scripts/prebuild.js` before compile; new prebuild script injects an idempotent `node-addon-api` type stub into node_modules.|\n\n## Sequence Diagram(s)\n\nmermaid\nsequenceDiagram\n  participant User\n  participant App as Desktop/Mobile App\n  participant Auth as Auth Website\n  participant API as Sync Target API\n  participant Settings\n\n  User->>App: Click \"Login with <service>\"\n  App->>Auth: Open authorisation URL (authWebsite)\n  Auth->>User: Prompt authorisation, returns applicationAuthUrl\n  App->>App: Start polling applicationAuthUrl\n  App->>API: checkIfLoginWasSuccessful(applicationAuthUrl, syncTargetId)\n  API-->>App: Return API key / credentials\n  App->>Settings: Save `sync.${syncTargetId}.apiKey`, username, password; set `sync.target`\n  App-->>User: Notify successful login / navigate away\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 2 | ❌ 1</summary>\n\n### ❌ Failed checks (1 warning)\n\n|     Check name     | Status     | Explanation                                                                          | Resolution                                                                         |\n| :----------------: | :--------- | :----------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n<details>\n<summary>✅ Passed checks (2 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                                                                                                                                                 |\n| :---------------: | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n|    Title check    | ✅ Passed | The title 'Fix/14372 joplin server oauth' directly references the issue being addressed and describes the main feature—enabling OAuth for Joplin Server. It aligns with the core changeset. |\n| Description check | ✅ Passed | The description comprehensively explains the PR's purpose, changes, and testing approach, all of which align with the changeset modifications across multiple components.                   |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing Touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings (stacked PR)\n- [ ] <!-- {\"checkboxId\": \"3e1879ae-f29b-4d0d-8e06-d12b7ba33d98\"} --> 📝 Generate docstrings (commit on current branch)\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\n\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- [encoded data, 11740 characters] -->\n\n<!-- internal state end -->",
			"author_association": "CONTRIBUTOR",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3939543223/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": {
				"id": 347564,
				"client_id": "Iv1.6aaafe4fe882736b",
				"slug": "coderabbitai",
				"node_id": "A_kwHOB96YWc4ABU2s",
				"owner": {
					"login": "coderabbitai",
					"id": 132028505,
					"node_id": "O_kgDOB96YWQ",
					"avatar_url": "https://avatars.githubusercontent.com/u/132028505?v=4",
					"gravatar_id": "",
					"url": "https://api.github.com/users/coderabbitai",
					"html_url": "https://github.com/coderabbitai",
					"followers_url": "https://api.github.com/users/coderabbitai/followers",
					"following_url": "https://api.github.com/users/coderabbitai/following{/other_user}",
					"gists_url": "https://api.github.com/users/coderabbitai/gists{/gist_id}",
					"starred_url": "https://api.github.com/users/coderabbitai/starred{/owner}{/repo}",
					"subscriptions_url": "https://api.github.com/users/coderabbitai/subscriptions",
					"organizations_url": "https://api.github.com/users/coderabbitai/orgs",
					"repos_url": "https://api.github.com/users/coderabbitai/repos",
					"events_url": "https://api.github.com/users/coderabbitai/events{/privacy}",
					"received_events_url": "https://api.github.com/users/coderabbitai/received_events",
					"type": "Organization",
					"user_view_type": "public",
					"site_admin": false
				},
				"name": "coderabbitai",
				"description": "# Transforming Code Reviews with AI\r\n\r\n## Features\r\n\r\n**Automated Reviews**: Continuous reviews of the pull requests including incremental commits. \r\n\r\n**Summarization**: Generates high-level summary and a technical walkthrough of the PR changes. \r\n\r\n**Line-by-line review**: Provides line-by-line suggestions committable with one click.\r\n\r\n**Codebase verification**:  Verifies the impact on the overall codebase and identifies missing changes.\r\n\r\n**Insights into your code**:  Ask any questions on your codebase within the pull request \r\n\r\n**Chat about your code** : Chat with the bot around your code. The more you chat, the smarter it gets.\r\n\r\n**Issue Validation**:  Validates the PR against the linked issues and identifies other related issues \r\n\r\n\r\n\r\n",
				"external_url": "https://coderabbit.ai?utm_source=cr_app&utm_medium=github",
				"html_url": "https://github.com/apps/coderabbitai",
				"created_at": "2023-06-14T15:47:27Z",
				"updated_at": "2026-03-14T07:58:44Z",
				"permissions": {
					"actions": "read",
					"checks": "write",
					"contents": "write",
					"discussions": "read",
					"issues": "write",
					"members": "read",
					"metadata": "read",
					"pull_requests": "write",
					"statuses": "write"
				},
				"events": [
					"issues",
					"issue_comment",
					"label",
					"organization",
					"pull_request",
					"pull_request_review",
					"pull_request_review_comment",
					"pull_request_review_thread",
					"release",
					"repository"
				]
			}
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3939556395",
			"html_url": "https://github.com/laurent22/joplin/pull/14417#issuecomment-3939556395",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14417",
			"id": 3939556395,
			"node_id": "IC_kwDOBLftOs7q0Nwr",
			"user": {
				"login": "mahendra-918",
				"id": 178264708,
				"node_id": "U_kgDOCqAahA",
				"avatar_url": "https://avatars.githubusercontent.com/u/178264708?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mahendra-918",
				"html_url": "https://github.com/mahendra-918",
				"followers_url": "https://api.github.com/users/mahendra-918/followers",
				"following_url": "https://api.github.com/users/mahendra-918/following{/other_user}",
				"gists_url": "https://api.github.com/users/mahendra-918/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mahendra-918/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mahendra-918/subscriptions",
				"organizations_url": "https://api.github.com/users/mahendra-918/orgs",
				"repos_url": "https://api.github.com/users/mahendra-918/repos",
				"events_url": "https://api.github.com/users/mahendra-918/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mahendra-918/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2026-02-21T21:45:31Z",
			"updated_at": "2026-02-21T21:45:31Z",
			"body": "I have read the CLA Document and I hereby sign the CLA\r\n",
			"author_association": "NONE",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3939556395/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3940517372",
			"html_url": "https://github.com/laurent22/joplin/pull/14417#issuecomment-3940517372",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14417",
			"id": 3940517372,
			"node_id": "IC_kwDOBLftOs7q34X8",
			"user": {
				"login": "laurent22",
				"id": 1285584,
				"node_id": "MDQ6VXNlcjEyODU1ODQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/laurent22",
				"html_url": "https://github.com/laurent22",
				"followers_url": "https://api.github.com/users/laurent22/followers",
				"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
				"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
				"organizations_url": "https://api.github.com/users/laurent22/orgs",
				"repos_url": "https://api.github.com/users/laurent22/repos",
				"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
				"received_events_url": "https://api.github.com/users/laurent22/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2026-02-22T08:47:30Z",
			"updated_at": "2026-02-22T08:47:30Z",
			"body": "Thanks for the submission.\r\n\r\nWhile this PR targets an existing issue, the proposed solution is not suitable for the project in its current form. Bringing it up to an acceptable standard would require significant redesign and guidance.\r\n\r\nFor future contributions, please ensure changes are well-aligned with the existing architecture and sufficiently tested.\r\n\r\nPlease make sure you read our guidelines: https://github.com/joplin/gsoc\r\n\r\nAnd our AI policy: https://github.com/joplin/gsoc/blob/master/ai_policy.md\r\n",
			"author_association": "OWNER",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3940517372/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		}
	]
}