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
}} / {{ 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
}
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' }}
}
}
}