@if (!connected()) {
Mastodon is My Blog Lite

See your Mastodon
as a place, not a feed.

A small client that runs entirely in this browser. No install. No project server holding your account.

Your access token and loaded posts stay in local browser storage. Lite requests read access, including permission to publish posts you write here.

@if (error()) { }
@if (heavyUrl) { Switch to heavy }
} @else {
{{ sampleMode() ? 'SAMPLE DATA' : 'LIVE, BOUNDED VIEW' }}
@if (heavyUrl) { Switch to heavy }
@if (account()?.avatar) { } @else if (account()) { {{ initials(account()!) }} } {{ account()?.acct }}
@if (page() === 'write') { } @else if (page() === 'analytics') { } @else if (page() === 'observability') { } @else {
@if (page() === 'people') { }
@if (threadAnchor()) {
@if (threadLoading()) {
Fetching the whole thread…
} @else { @for (post of threadContext()?.ancestors ?? []; track post.id) { } @for (post of threadContext()?.descendants ?? []; track post.id) { } }
} @else if (page() === 'forums') {
DISCUSSIONS

{{ forumFilterLabels[forumFilter()] }}

{{ visibleThreads().length }} threads in this loaded window

@if (error()) { } @if (loading()) {
Asking your instance…
} @for (thread of visibleThreads(); track thread.rootId) {
@if (thread.root) { {{ thread.root.account.display_name || thread.root.account.acct }} @if (thread.rootInstance) { {{ thread.rootInstance }} } } @else { earlier post not loaded } @if (thread.hasQuestion) { asks a question } {{ relativeDate(thread.latestActivity) }}
@if (thread.root) {
} @else {
}
@for (replier of threadRepliers(thread); track replier.id) { @if (replier.avatar) { } } {{ thread.replyCount }} repl{{ thread.replyCount === 1 ? 'y' : 'ies' }}
} @empty { @if (!loading()) {
No discussions match this filter in the loaded window.
} } } @else {
{{ page() === 'people' ? 'MICROBLOG' : filterLabel().toUpperCase() }}

{{ page() === 'people' ? selectedAccount()?.display_name || account()?.display_name || account()?.acct : filterLabel() }}

{{ visibleStatuses().length }} posts in this loaded window

@if (error()) { } @if (loading()) {
Asking your instance…
} @for (status of visibleStatuses(); track status.id) { @let post = displayStatus(status);
@if (status.reblog) {
{{ status.account.display_name || status.account.acct }} boosted
} @if (post.spoiler_text) {
{{ post.spoiler_text }}
} @else {
} @for (media of post.media_attachments; track media.id) { @if (media.type === 'image') { } @else if (media.type === 'video' || media.type === 'gifv') { } }
↩ {{ post.replies_count }}⟳ {{ post.reblogs_count }}♡ {{ post.favourites_count }} @if (hasThread(status)) { } @if (post.url) { Open on Mastodon ↗ }
} @empty { @if (!loading()) {
No matching posts in this loaded window.
} } }
} }
@if (post.spoiler_text) {
{{ post.spoiler_text }}
} @else {
}