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

  1. Purchase or renew the SiYuan subscription and ensure the account is logged in
  2. Use local reminder mechanisms or skip cloud reminder sync for non-subscriber accounts
  3. 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

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


AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11). Data as JSON: /api/errors/c206b8d0efcf8966. Report an issue: GitHub.