I keep meaning to say — the porch light is the most unreasonably comforting object I own. It's the only piece of architecture in our entire house that has a single, honest job, and it does it.
Pull up a chair.
Bluesky, at reading speed.
Lanai is our Bluesky client for readers — the people who'd rather sit with three good posts than scroll past three hundred. Editorial typography on every post. A slow-browse Postcard Mode where each one arrives as something you can pick up, turn over, and put back down. On-device intelligence that re-presents what you chose, without ever choosing for you. The porch is a metaphor. It's also the whole pitch.
The thesis
Big, bold, readable elements are the design.
Three claims that drive every layout, type ramp, and color decision in the app. Lose any one of them and Lanai stops being Lanai.
Big, bold, readable is the design.
Editorial typography isn't a setting; it's the aesthetic. 17pt body minimum at default. Hanging punctuation, optical margin alignment, and proper dashes in Reading Mode. Curly quotes everywhere because your keyboard couldn't be bothered.
Accessibility as visible design language.
AX1 is the design baseline, not the accommodation. Every screen looks correct at all twelve Dynamic Type sizes, including AX5. If a layout breaks at AX3, the layout was wrong — not your eyes.
Designed to be sat with.
Felt-quality is the brand promise — relaxation, comfort, considered engagement, the occasional small joy. The single failure mode is urgency. A social app can lower a reader's nervous system rather than raise it; Lanai is the one that does.
Three reading modes
Same posts. Three speeds. Your call.
Most clients render Bluesky one way and ask you to live with it. Lanai ships three modes that share the same data and switch with a single tap — because the same person reads differently on a Tuesday morning than on a Sunday afternoon.
Efficient. Honest. The default for a reason.
Chronological, dense enough to scan, set in editorial type. The mode you live in on a normal day. New users land here.
Each post is a card on the porch table.
Subtle borders, slight rotation seeded by post ID, a postage stamp for the post type, a postmark for the timestamp. Long-press flips the card to reveal what's on the back.
A post becomes a designed object.
Hanging punctuation. Optical margin alignment. Pull quotes on selection. Generous leading. The full editorial treatment, applied where you've explicitly asked for it.
All three modes render the same `Post` value type. No data refetch when you switch — just a different way of being with the same words.
Who it's for
Two readers. The same porch.
Lanai is built for the considered reader who'd rather spend ten good minutes than scroll three hundred bad ones — and for the elder reader whose adult child set up Bluesky on her iPad. The accessibility decisions that work for the second reader make the app feel inevitable to the first.
For the design-aware reader
The user whose attention has been mistreated by software.
You've bought Things 3, Reeder, iA Writer, Tot. You notice typography. You notice motion. Lanai is a Bluesky client that earns the room on your home screen by treating the porch metaphor like a thesis, not a decoration.
- Reading Mode renders a single post with full editorial typography — hanging punctuation, optical margin alignment, generous leading — without you opting into anything fussy.
- Two themed variants — Miami in the light, Dusk in the dark — that read like a Kindle Paperwhite and a quiet hotel lamp, respectively. High Contrast appears the moment your OS asks.
- Postcard Mode replaces the feed with a stack of cards on the porch table. Pick one up. Flip it over to read the engagement context on the back. Put it down.
For the reader your child set this up for
The widow whose son configured Bluesky on her iPad.
Lanai is designed so you can hand it to a parent and not come back next weekend to fix it. Type sizes that work at 74 the way they work at 34. Touch targets that don't require a stylus and a prayer. We design at AX1 first and verify at default — the inverse of how the rest of the App Store works.
- 44pt touch targets at default, 56pt at AX3 and up. Big enough to read, big enough to tap, big enough that your grandkid's reply doesn't open by accident.
- Quiet content overlay (v1.x) adds a tap-to-view friction for distressing imagery. Never silently filters; always your choice.
- No accounts to remember beyond the Bluesky app password. No upsell screens. No "rate us" modal showing up the week you finally got comfortable.
Two variants. One OS-driven surface.
The light you want to read in.
Lanai ships two themed variants at v1.0 — Miami in the light, Dusk in the dark — plus a High Contrast surface that appears the moment your OS asks for Increased Contrast. APCA-verified at body text. Same app underneath. Pick the room you're in; the OS handles the rest.
Miami
Default light variant
Sun-bleached cream canvas, deep-cocoa ink, faded teal accent, dusty rose for the like. Reads like a Kindle Paperwhite, not a freshly opened Pages document.
Dusk
Default dark variant
Tinted indigo-black canvas, warm off-white ink, soft sky-indigo accent, warm coral for the like. Built for late-evening reading without straining your eyes — not OLED black for its own sake.
High Contrast
OS-driven, not a picker option
Appears automatically the moment your OS asks for Increased Contrast. Pure-white or pure-black canvas, body text at APCA Lc 90+ everywhere. Not a fallback for accessibility users — it's the most readable surface for anyone reading in bright sunlight.
Features
Nine of 24. The rest are on the features page.
Every feature has to clear three bars before it ships: it has to look correct at AX3, it has to work without an account beyond the Bluesky app password, and it has to behave the same on iPhone, iPad, and Mac. If a feature fails any one of those, the feature is wrong.
Reading Mode
Tap a post and it expands into an editorial reading view: hanging punctuation, optical margin alignment, generous leading, proper hyphenation. The post becomes a small designed object instead of a row in a feed.
Long posts finally read like prose, not status lines.
Three feed modes, one feed.
Standard Timeline (efficient), Postcard Mode (slow), Reading Mode (single-post focus). The same posts, three ways to be with them. Switch modes with a quiet control in the top bar.
You pick the pace. The app doesn't pick it for you.
Each post becomes a postcard.
Subtle keylines, slight rotation seeded by post ID, soft shadow, a postage-stamp icon for the post type, a postmark-style timestamp. Hand-placed, not arranged.
The timeline stops feeling like a list and starts feeling like a stack.
Long-press flips the card.
The back side carries the things every other client puts loudly on the front: full timestamp, engagement context phrased as ambient information, the post's full URI for users who care.
The front is for the words. The back is for everyone else.
Three card formats.
Short posts render as postcards, long posts as folded letters with a hint of paper fold, image-heavy posts as Polaroids with the white border below. Same metaphor, different stationery.
A varied stack feels like correspondence, not throughput.
Reduce Motion is respected.
Rotation disables. Springs simplify to crossfades. The card flip becomes a sheet presentation. Nothing about the metaphor breaks; the motion just steps aside.
Tactile when you want it, still when you don't.
Posts rendered with care.
Em dashes display as em dashes, not as `--`. Smart quotes instead of straight ones. Mojibake from copy-paste gets quietly recovered. Whitespace at the boundaries gets normalized; nothing in the middle does.
Other people's words show up looking like they meant them.
The original is always one tap away.
Cleanup happens at the render layer. The post record never changes; we never modify the data. Long-press → 'Show original' to see the post exactly as authored. Settings let you turn cleanup off entirely.
Editorial without paternalism.
Locale-aware quote conventions.
French guillemets in French. German lower-quotes in German. Japanese brackets where they belong. The post's `langs` field tells us which conventions to apply; we follow.
Multilingual feeds stop looking like ASCII concessions.
Bright lines
Things we never do, in writing, on purpose.
Most apps have a list like this somewhere internally. We keep ours in public so you can hold us to it. If we ever do any of these things, we've stopped being Lanai, and you're owed an explanation.
Never modify your post in compose.
What you type is what you post. The cleanup we apply to other people's posts when displaying them, we never apply to yours mid-typing.
Never modify post records on the network.
Cleanup is a render-layer transformation. The original `RichText` is what goes to the AT Protocol. Other clients see what you wrote.
Never make Postcard Mode the default.
Standard Timeline is the default. Postcard Mode is the experience you choose when you want to read deliberately, not the one we choose for you.
Never use cloud AI on your content.
Apple's on-device APIs only. Not Private Cloud Compute. Not third-party. If a feature can only be implemented in the cloud, it doesn't ship.
Never select content for you.
AI re-presents content you chose to follow. It does not select which posts you see from a larger pool. The Following feed is chronological. Period.
Never AI personality.
No "I generated this for you." No "Here's what I think." AI is plumbing. Suggestions appear as suggestions, not as a chatbot's contribution to the conversation. Windy is the only character in Lanai.
Never streaks. Ever.
No "you haven't posted in 5 days" notification. No "best time to post" suggestion. No engagement predictions. Lanai is for reading, and reading doesn't have a streak.
Never claim to fix posts.
Typographic cleanup happens at the render layer — never on the post record, never on the network. We refine display. We don't "improve." Long-press any post to reveal the original, character for character.
Never AI-driven moderation.
Quiet content overlays add a tap-to-view friction; they never silently filter. Classification stays additive. The user is the moderator of last resort.
Where it doesn't fit
Not a feed reader. Not a Mastodon client. Not Bluesky reinvented.
Lanai is one Bluesky client among many. We don't bridge to Mastodon, we don't fork the protocol, and we don't replace the Following feed with our own algorithmic guess. It's Bluesky — read carefully, on a porch.
Questions we get a lot
For the people who'd rather skim than wait.
Why another Bluesky client? +
Because Bluesky deserves a client that takes display seriously. Phoenix and IcySky compete on motion. Graysky competes on features. Skeets competes on accessibility utility. Lanai competes on the quality of the reading experience — and right now, no one else is working on that.
What's a Lanai? +
Hawaiian-origin English word for a roofed structure with open sides used as a porch or living room. The place where the world goes by but you're sheltered from it. We use the Americanized spelling — no kahakō or ʻokina — because this isn't a Hawaiian-themed app, it's a porch. With respect to the word's roots, and to everyone who's ever sat on one.
Who is Windy? +
Lanai's mascot. A brown-and-white beagle-terrier mix who presides over empty states, launch animations, the About screen, and the occasional quiet corner of the app where a small dog belongs. She's the reason the porch exists.
When does it ship? +
Pre-alpha now. v1.0 is the considered launch — eight feature tracks, eighteen to twenty-two build sessions, Sessions 1–4 complete. Not the minimum-viable release. We'd rather take the time and ship something complete than slice it thin, and the brand thesis frankly requires it. No public date yet.
Why the App Password instead of real OAuth? +
AT Protocol OAuth is still maturing as of early 2026. v1 uses App Password authentication stored in Keychain, keyed by DID rather than handle (handles change). When the OAuth story stabilizes, v2 ships ATOAuthKit + ASWebAuthenticationSession. The choice is honest, not preferred.
Is the AI optional? +
Every AI feature is opt-in, reversible, on-device, and gracefully degrading. A user who never enables a single AI feature has a fully functional Lanai. AI helps you fulfill your own past intentions; it does not select content for you.
Will it work on my iPhone 12? +
Yes. iOS 17+ is the floor — needed because @Observable and SwiftData are non-negotiable. AI features check availability and degrade gracefully on older hardware; nothing is gated. You get Lanai minus the optional helpers.
Does it support custom feeds, lists, and the rest of the AT Protocol surface? +
Yes. Custom feeds, lists, mute lists (including subscribing to public ones), labelers, threadgates — the AT Protocol surface area is on the v1.0 list. Browse-feeds directory and public mute list subscription got promoted from v1.x to v1.0 because they're load-bearing for the audiences we care about.
What about pricing? +
Decided closer to launch. The studio pattern is one-time purchases, not subscriptions, and that's likely where Lanai lands too. If we ship anything subscription-shaped, it'll be for a feature that has a real ongoing server cost — not a license to keep using software you already paid for.
Pre-alpha. Real porch. Drop a note.
We're building Lanai out in the open and reading every email that comes in. Tell us how you read Bluesky now, what you'd want a calmer client to do, and whether you'd test on iPhone, iPad, or Mac. We'll get you on the list.
For Windy. The dog who runs the porch.
Also from the studio
More pixeLantern apps
A native Mac media wall with a mean little grin.
Open flexGrid →
Fast workout logging for solo lifters.
Open flexRep →
Turn any script into a multi-voice podcast.
Open flexVox →
Audio levels on your screen edge.
Open flexMeter →
Every format in. Clean Markdown out.
Open flexDoc →
Messy spreadsheet in. Print-ready dashboard out.
Open flexStats →