Admin
@if (!status?.connected) {
}
@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' }}
{{ syncing ? 'Syncing...' : 'Force Refresh Cache' }}
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 }}
}
{{ ownAccountSyncing ? 'Importing...' : 'Initialize/Catch Up Own Account' }}
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 }}
}
{{ followingJob && !followingJob.finished ? 'Running...' : 'Download All Friends' }}
@if (followingJob && !followingJob.finished) {
Stop
}
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 }}
}
{{
notificationsJob && !notificationsJob.finished
? 'Running...'
: 'Download All Notifications'
}}
@if (notificationsJob && !notificationsJob.finished) {
Stop
}
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 }}
}
{{ recomputingStats ? 'Recomputing...' : 'Re-bin Blog Roll' }}
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 }}
}
{{ backfillingFlags ? 'Backfilling...' : 'Backfill Questions & Books' }}
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 }}
}
{{ nlpStatus?.job && !nlpStatus!.job!.finished ? 'Running...' : 'Run NLP Backfill' }}
@if (nlpStatus?.job && !nlpStatus!.job!.finished) {
Stop
}
Catch-Up
@if (catchupError) {
{{ catchupError }}
}
@if (!catchupStatus?.running) {
{{ catchupLoading ? 'Starting...' : 'Catch Up Now (Urgent)' }}
Start Trickle
}
@if (catchupStatus?.running) {
Stop
}
@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'
}}
}
}
Refresh Queue
}
@if (catchupQueue && catchupQueue.queue.length === 0) {
No accounts in the catch-up queue.
}
Content Hub Bundles
{{ syncingFollows ? 'Syncing...' : 'Sync Server Follows' }}
+ New Bundle
@if (bundlesError) {
{{ bundlesError }}
}
@if (editState) {
{{ editState.bundleId === null ? 'New Bundle' : 'Edit Bundle' }}
Name
Terms
+ Add term
@for (term of editState.terms; track $index; let i = $index) {
# hashtag
search
×
}
@if (editState.terms.length === 0) {
No terms yet — add at least one hashtag or search query.
}
@if (editState.error) {
{{ editState.error }}
}
Cancel
{{ editState.saving ? 'Saving...' : 'Save' }}
}
@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) {
Edit
{{ deletingId === bundle.id ? '...' : 'Delete' }}
}
}
Error Log
{{ errorLogLoading ? 'Loading...' : 'Load 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 }}
}
}
}
}