{"record":{"id":"020bae8e16e47c29","repo":"siyuan-note/siyuan","slug":"this-feature-requires-the-purchase-of-an-a-target","errorCode":null,"errorMessage":"This feature requires the purchase of an <a target='_blank' href='${accountServer}/subscribe/siyuan'>[Annual Subscription]</a> (if you have already purchased, please refresh or re-login in [Settings - Account & Sync - Account])","messagePattern":"This feature requires the purchase of an <a target='_blank' href='(.+?)/subscribe/siyuan'>\\[Annual Subscription\\]</a> \\(if you have already purchased, please refresh or re-login in \\[Settings - Account & Sync - Account\\]\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kernel/model/blockial.go","lineNumber":45,"sourceCode":"\t\"github.com/88250/lute/ast\"\n\t\"github.com/88250/lute/editor\"\n\t\"github.com/88250/lute/html\"\n\t\"github.com/88250/lute/parse\"\n\t\"github.com/araddon/dateparse\"\n\t\"github.com/siyuan-note/siyuan/kernel/av\"\n\t\"github.com/siyuan-note/siyuan/kernel/cache\"\n\t\"github.com/siyuan-note/siyuan/kernel/filesys\"\n\t\"github.com/siyuan-note/siyuan/kernel/sql\"\n\t\"github.com/siyuan-note/siyuan/kernel/treenode\"\n\t\"github.com/siyuan-note/siyuan/kernel/util\"\n)\n\nfunc SetCloudReminder(id, content, timed string) (err error) {\n\tif !IsSubscriber() {\n\t\tif \"ios\" == util.Container {\n\t\t\treturn errors.New(Conf.Language(122))\n\t\t}\n\t\treturn errors.New(Conf.Language(29))\n\t}\n\n\tvar timedMills int64\n\tif \"0\" != timed {\n\t\tt, e := dateparse.ParseIn(timed, time.Now().Location())\n\t\tif nil != e {\n\t\t\treturn e\n\t\t}\n\t\ttimedMills = t.UnixMilli()\n\t}\n\n\tcontent = strings.TrimSpace(content)\n\terr = SetCloudBlockReminder(id, content, timedMills)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif \"0\" == timed {","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/afa823b6b4e4f183511e0bc0a3be93caa94c7c97/kernel/model/blockial.go#L27-L63","documentation":"kernel/model/blockial.go:45, from SetCloudReminder: the caller is not an active subscriber (IsSubscriber() false) on a non-iOS container, so the kernel returns language key 29: the 'This feature requires the purchase of an [Annual Subscription]' message pointing at ${accountServer}/subscribe/siyuan, with the hint to refresh or re-login in Settings - Account & Sync - Account if already purchased. It is an entitlement rejection, not a malfunction - the operation is simply not performed.","triggerScenarios":"Calling the cloud reminder endpoint from desktop/browser/mobile-web containers while the logged-in account has no active subscription; expired subscription; account logged out but stale client state.","commonSituations":"Free-account users trying cloud reminders (WeChat reminders); subscription lapsed after renewal failure; token state stale after purchasing in another client.","solutions":["Purchase the annual subscription (link in the message), then retry.","If already purchased: refresh or re-login in Settings - Account & Sync - Account.","Verify account state first via the account API to distinguish logged-out vs unpaid.","Use purely local features if you do not intend to subscribe."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Optional pre-flight: confirm subscription before calling paid endpoints\nconst acc = await (await fetch(\"/api/account\", { method: \"POST\" })).json();\nconst sub = acc.data?.user?.siyuanProSubscription ?? {};\nif (!sub.valid?.(sub.oneTimePayStatus) && !(acc.data?.user?.siyuanProSubscription)) {\n  promptPurchase();\n}","typeGuard":null,"tryCatchPattern":"try {\n  await setCloudReminder(id, content, timed);\n} catch (e) {\n  if (/Annual Subscription/.test(e.message)) { promptPurchase(); return; }\n  throw e;\n}","preventionTips":["Check subscription state once at integration startup rather than per call.","Surface the refresh/re-login hint verbatim - it resolves most 'already paid' reports."],"tags":["siyuan","subscription","paywall","reminder"],"backgroundTag":"feature-requires-subscription","analyzedSha":"afa823b6b4e4f183511e0bc0a3be93caa94c7c97","analyzedAt":"2026-08-18T17:04:10.865Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}