siyuan-note/siyuan · warning
Conf.Language(29) (localized subscription-required message)
Error message
Conf.Language(29) (localized subscription-required message)
What it means
SetCloudReminder requires an active SiYuan subscription. When the user is not a subscriber and the container is not iOS, it returns the generic localized subscription-required message from Conf.Language(29). Same entitlement guard as the iOS variant, applied to desktop, mobile (non-iOS), and other containers.
Source
Thrown at kernel/model/blockial.go:45
"github.com/88250/lute/ast"
"github.com/88250/lute/editor"
"github.com/88250/lute/html"
"github.com/88250/lute/parse"
"github.com/araddon/dateparse"
"github.com/siyuan-note/siyuan/kernel/av"
"github.com/siyuan-note/siyuan/kernel/cache"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
)
func SetCloudReminder(id, content, timed string) (err error) {
if !IsSubscriber() {
if "ios" == util.Container {
return errors.New(Conf.Language(122))
}
return errors.New(Conf.Language(29))
}
var timedMills int64
if "0" != timed {
t, e := dateparse.ParseIn(timed, time.Now().Location())
if nil != e {
return e
}
timedMills = t.UnixMilli()
}
content = strings.TrimSpace(content)
err = SetCloudBlockReminder(id, content, timedMills)
if err != nil {
return
}
if "0" == timed {View on GitHub (pinned to 8641553a1f)
Solutions
- Purchase or renew the SiYuan subscription and ensure the account is logged in
- Use local reminder mechanisms or skip cloud reminder sync for non-subscriber accounts
- Check IsSubscriber-equivalent state client-side before calling setCloudReminder and show the upgrade prompt (Language 29)
Example fix
// before
await fetchPost('/api/block/setCloudReminder', {id, content, timed});
// after
const sub = await fetchPost('/api/account/...', {}); // check subscription state first
if (!sub.data.isSubscriber) {
showMessage(window.siyuan.languages[29]); // prompt upgrade instead of erroring
return;
}
await fetchPost('/api/block/setCloudReminder', {id, content, timed}); Defensive patterns
Strategy: try-catch
Validate before calling
if (!window.siyuan.user || subscriptionExpired(window.siyuan.user)) {
showMessage(window.siyuan.languages[29]);
return;
} Try / catch
try {
await fetchPost('/api/block/setCloudReminder', {id, content, timed});
} catch (e) {
if (String(e.msg || e) === window.siyuan.languages[29]) {
openMembershipDialog(); // prompt upgrade once, no retry
return;
}
throw e;
} Prevention
- Gate cloud reminder calls on the logged-in user's subscription state
- Treat this error as a permanent condition until the subscription is renewed
- Provide local reminder alternatives in plugins aimed at non-subscriber users
When it happens
Trigger: Calling SetCloudReminder (API /api/block/setCloudReminder) without an active subscription on desktop or non-iOS mobile — e.g. a plugin or script setting a cloud reminder while logged out or with an expired subscription.
Common situations: Self-hosted/desktop users without membership invoking the cloud reminder API via automation; subscription lapsing between calls; scripts assuming reminder sync is free.
Related errors
- Conf.Language(122) (localized subscription-required message
- The sidebar feature that comes with the plugin needs to be c
- This feature requires the purchase of an <a target='_blank'
- kernel log path is unavailable
- Conf.Language(376)
AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11).
Data as JSON: /api/errors/c206b8d0efcf8966.
Report an issue: GitHub.