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

See your Mastodon
as a place, not a feed.

A live, read-only client that runs entirely in this browser. No install. No project server holding your account.

Your access token and recent posts stay in local browser storage. Lite requests read access only.

@if (error()) { }
} @else {
{{ sampleMode() ? 'SAMPLE DATA' : 'LIVE, BOUNDED VIEW' }}
@if (account()?.avatar) { } @else if (account()) { {{ initials(account()!) }} } {{ account()?.acct }}
@if (page() === 'about') {
THE FULL APPLICATION

Lite is the front porch.
The installed app is the house.

Lite reads a small live window. The full app builds durable history in SQLite and can ask the expensive, interesting questions that make Mastodon feel like your own web.

LiteLive recent postsLocal media and link filtersBrowser-only seen state
InstalledDurable history and catch-upAnalytics, dossiers, forums, cohortsWriting, drafts, sync, and deep queries
Install the full app →
} @else {
{{ selectedAccount() ? 'RECENT ACCOUNT POSTS' : filterLabel().toUpperCase() }}

{{ selectedAccount()?.display_name || (page() === 'me' ? 'My Blog' : 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 (post.url) { Open on Mastodon ↗ }
} @empty { @if (!loading()) {
No matching posts in this loaded window.
} }
} }