Admin

@if (!status?.connected) {

You are not connected to Mastodon.

} @if (status?.connected) {

Cache Sync

Refreshes cached follows/followers, recent home timeline activity, notifications, and your own recent posts for the connected identity.
Status: Connected
Last Sync: {{ status?.last_sync | date: 'medium' }}

Own Account Archive

Fetches your full Mastodon posting history from your own account and stores it in the cache for static blog generation. This can take a while on older accounts.
@if (ownAccountError) {
{{ ownAccountError }}
} @if (ownAccountMessage) {
{{ ownAccountMessage }}
}

Download All Friends

The regular sync only captures the most recent 80 followers/following and accounts that posted recently. Use this to pull your entire following + follower lists once, so every person you follow shows up in the blog roll — not just the chatty ones.
@if (followingJobError) {
{{ followingJobError }}
} @if (followingJob && !followingJob.finished) {
Running — {{ followingJob.stage }} {{ followingJob.done }} @if (followingJob.total) { / {{ followingJob.total }} }
} @if (followingJob && followingJob.finished && followingJob.ok && followingJob.result) {
Done. Imported {{ followingJob.result['following'] }} following + {{ followingJob.result['followers'] }} followers.
} @if (followingJob && followingJob.finished && !followingJob.ok) {
Failed: {{ followingJob.error }}
}
@if (followingJob && !followingJob.finished) { }

Download All Notifications

The regular sync only keeps the last 80 notifications. Pull your entire notification history so the Readers blogroll filter can surface every person who has ever reposted your content.
@if (notificationsJobError) {
{{ notificationsJobError }}
} @if (notificationsJob && !notificationsJob.finished) {
Running — {{ notificationsJob.stage }} {{ notificationsJob.done }} notifications
} @if (notificationsJob && notificationsJob.finished && notificationsJob.ok) {
Done. Imported {{ notificationsJob.done }} notifications total.
} @if (notificationsJob && notificationsJob.finished && !notificationsJob.ok) {
Failed: {{ notificationsJob.error }}
}
@if (notificationsJob && !notificationsJob.finished) { }

Blog Roll Post Stats

Recomputes cached post and reply counts for every followed account, using already-cached posts. No API calls. Run this after a catch-up to keep the Chatty and Broadcasters filters accurate.
@if (recomputeStatsError) {
{{ recomputeStatsError }}
} @if (recomputeStatsMessage) {
{{ recomputeStatsMessage }}
}

Backfill Content Flags

Re-analyses cached posts to populate has_question and has_book flags. Run once after upgrading to add these filters to existing posts. No API calls.
@if (backfillFlagsError) {
{{ backfillFlagsError }}
} @if (backfillFlagsMessage) {
{{ backfillFlagsMessage }}
}

Forum Topic Words (NLP Backfill)

Precomputes uncommon topic words for each forum thread using spaCy. Run this once after importing posts, then re-run when you want fresh results. Requires en_core_web_sm to be installed.
@if (nlpStatus) {
@if (nlpStatus.needs_run) { {{ nlpStatus.done_threads }} / {{ nlpStatus.total_threads }} threads indexed — needs run } @else { All {{ nlpStatus.total_threads }} threads indexed ✓ }
} @if (nlpJobError) {
{{ nlpJobError }}
} @if (nlpStatus?.job && !nlpStatus!.job!.finished) {
Running — {{ nlpStatus!.job!.stage }} {{ nlpStatus!.job!.done }} @if (nlpStatus!.job!.total) { / {{ nlpStatus!.job!.total }} } threads
} @if (nlpStatus?.job?.finished && nlpStatus!.job!.ok) {
Done. Indexed {{ nlpStatus!.job!.result?.['processed'] }} threads.
} @if (nlpStatus?.job?.finished && !nlpStatus!.job!.ok) {
Failed: {{ nlpStatus!.job!.error }}
}
@if (nlpStatus?.job && !nlpStatus!.job!.finished) { }

Catch-Up

@if (catchupError) {
{{ catchupError }}
}
@if (!catchupStatus?.running) { } @if (catchupStatus?.running) { }
@if (catchupStatus) {
{{ catchupStatus.running ? 'Running' : 'Finished' }} — {{ catchupStatus.mode }} {{ catchupStatus.done }}/{{ catchupStatus.total }} accounts
@if (catchupStatus.current_acct) {
Processing: {{ catchupStatus.current_acct }}
}
@if (catchupStatus.errors > 0) { {{ catchupStatus.errors }} errors } @if (catchupStatus.rate_limited) { Rate limited — backing off } Started: {{ catchupStatus.started_at | date: 'shortTime' }} @if (catchupStatus.finished_at) { Finished: {{ catchupStatus.finished_at | date: 'shortTime' }} }
} @if (catchupQueue && catchupQueue.queue.length > 0) {

Priority Queue (first {{ catchupQueue.queue.length }})

@for (entry of catchupQueue.queue; track entry.acct; let i = $index) {
{{ i + 1 }} {{ entry.display_name || entry.acct }} @{{ entry.acct }} @if (entry.is_followed_by) { mutual } @if (entry.last_status_at) { {{ entry.last_status_at | date: 'mediumDate' }} }
}
} @if (catchupQueue && catchupQueue.queue.length === 0) {
No accounts in the catch-up queue.
}

Content Hub Bundles

@if (bundlesError) {
{{ bundlesError }}
} @if (editState) {

{{ editState.bundleId === null ? 'New Bundle' : 'Edit Bundle' }}

Terms
@for (term of editState.terms; track $index; let i = $index) {
} @if (editState.terms.length === 0) {
No terms yet — add at least one hashtag or search query.
}
@if (editState.error) {
{{ editState.error }}
}
} @if (bundlesLoading) {
Loading...
} @if (!bundlesLoading && bundles.length === 0 && !editState) {
No bundles yet. Create one or sync your server-side followed hashtags.
} @for (bundle of bundles; track bundle.id) {
{{ bundle.name }} @if (bundle.source_type === 'server_follow') { server follow } @else { bundle }
@for (term of bundle.terms; track term.id) { {{ termTypeLabel(term) }} {{ term.term }} } @if (bundle.terms.length === 0) { No terms }
@if (bundle.last_fetched_at) {
Last fetched: {{ bundle.last_fetched_at | date: 'short' }}
}
@if (!bundle.is_read_only) {
}
}

Error Log

Recent WARNING and ERROR messages written to the database. Useful for diagnosing silent failures.
@if (errorLogError) {
{{ errorLogError }}
} @if (errorLogExpanded && errorLog.length === 0) {
No error log entries found.
} @if (errorLog.length > 0) {
@for (entry of errorLog; track entry.id) {
{{ entry.level }} {{ entry.iso | date: 'short' }}
{{ entry.message }}
{{ entry.logger }}
@if (entry.exc_text) {
{{ entry.exc_text }}
}
}
}
}