- Swift 100%
- Shell <1%
blusco #
A Bluesky client for Mac and iPhone that doesn't use follows.
Idea #
Most social apps are built around following people. blusco is built around being there together: sharing a place with others at a distance where nobody can reach out and grab what you say. People you keep seeing become familiar faces, even if you never learn their names.
- No following timeline: the home timeline is built from follows, so blusco doesn't read it
- Windows instead of follows: put people, keywords, and feeds in a window on your device. Nothing is written to Bluesky. No follow or list records, and nobody is told they are in a window
- Voices, not items: posts are speech bubbles. Whoever starts a conversation is on the right; replies are on the left. Your own voice is a pale blue bubble
- A breathing light instead of badge counts: no red numbers. When new blue dots arrive, the ring around your icon in the dock glows softly, with a 1/f flicker. Nothing to count; look when you notice
In each pair of screenshots, Mac is on the left and iPhone on the right. The people and posts are made up.
Reading #
- 18 characters per line: like iMessage, bubbles never stretch across the whole window. A bubble longer than four lines splits in two at a sentence break, the way manga splits long speech balloons
- Threads stay together: a person's chain of self-replies stays in one piece. Replies to posts in the middle come after it, marked with the line they answer
- Photos outside the bubble: photos are things shown, bubbles are voices
- Long posts on a small sheet: a pale sheet the width of a bubble, small type, folded at three lines
- Reposts are clippings: shown like a paper clipping someone brings along. A comment posted right after a repost follows the clipping
- Clock: the clock at the top shows how long ago the top post was written. Tap it to reload and jump to the top
- Translate in place: posts in other languages are translated on device (Translation framework). Nothing is sent to an outside service
Mac spread #
- An open book: the window is a page with the proportions of a Japanese hardcover (127 × 188 mm); two panes make a spread
- Left is contents, right is the text: the left page holds the window's cover (name, styles, who is here, your own posts there) and the contents. What you open, from either page, goes to the right page. A conversation or a profile stacks over the stream; go back and you are where you were reading
- Contents: the window button in the dock opens the contents on the left page. Feeds and lists carry a small icon by the name and a one-line description
- Search: the field and what it finds (people, feeds) on the left, posts on the right. The person icon in the field searches only your own posts
- Bookmarks: a conversation open on the right page can be bookmarked from the header. Bookmarks are Bluesky's private bookmarks, so the official app shows the same list. Read them again from Bookmarks in the contents
- Write in the place: the writing field appears only when you press write, under the right page. ⌘Return stacks what you wrote as a dashed bubble where it will land (top of the stream, or the end of a conversation). With the field empty the send button turns into ⇈; press it or ⌘⇧Return to post the stack as a thread. Click a stacked bubble to edit it. Drag images onto the field to attach them. Esc closes the field and keeps the draft. Cairn, the record of what you gave blue dots to, has no write button
- Dock in the gutter: the dock stays closed, leaving only your icon at the bottom between the pages. Press it and the dock opens in the middle of the spread
- Page size: the spread sets 30 characters to a line. Drag the window corner and text, icons and margins grow together. ⌘+ and ⌘− do the same, and ⌘0 returns to the standard size. ⌘\ switches to a single page: 22 characters to a line, fixed width, free height
Blue dots #
- Blue dots instead of hearts: likes are blue squares that deepen as more people press them. No numbers anywhere
- Your own press is the deepest blue: so you can tell it apart from squares deepened by others. Press again to take it back; that stays in your activity log, faded
- A calendar: blue dots on your posts are shown in a calendar on the back of your profile card. Tap a day to jump there in the log
Activity log #
- Your profile is an activity log: what you wrote, your conversations, blue dots you received, and blue dots you gave, in one timeline
- Spaces: a post written in a window or feed is placed in that window or feed only. The log marks where with a small circle; tap it to jump there
- Calendar: swipe the card for a year of blue dots
Landing #
- The second layer of the timeline: the first layer is the stream of top posts. Under it sit the exchanges with other people. They are public, but a normal timeline does not show them. Landing gathers the conversations under your familiar faces' top posts, and the ones they joined elsewhere
- Gone after 24 hours, back with the next reply: a conversation disappears 24 hours after its last reply, and comes back when someone replies again. blusco watches seven days of your familiar faces' posts. The boundary is time, not a member list or a tag
- Shape: the first layer (the opening post and the author's own follow-ups) sits on pale crimson. Replies are set at about 90 percent size, all the same, so nobody in the conversation outranks anyone else. Your own posts keep your color everywhere
- Loading: while it reads, the clock at the top glows blue. The first open reads a few hundred threads, so give it a moment
Mezzanine #
- One line: a window holding only Mezzanine cashtags ($sT3m0 and so on) reads as a single line instead of bubbles, oldest at the top
- Hooks: tap a tag at the top to narrow the line to it. Add your own tags with +, and long-press to reorder
- Mezzanine and Landing: Mezzanine is a way of managing information that links posts with cashtags. Its name means the floor between floors, and as a technique it stays as it is. Cashtags have to be remembered and typed, though. blusco's Landing comes from a different angle: no marks, just a place that forms out of ordinary replies
Window styles #
- Styles: choose which kinds of posts flow into each window. Four types from my SNS equations: Broadcast and Commentary under Spread, Diary and Nods under Nearby. Pick any number
- Kinds: blusco tells the types apart by the shape of a post. Seven kinds: long posts, clippings, quotes, long replies, short replies, solo posts and images. Each can be toggled on its own
- Feeds and lists too: while reading a saved feed or list, the settings button at the top opens the same styles
Per person #
- Choose per person: from the gear on anyone's profile, leave out their long posts, clippings (their reposts), quotes, or images (any post with a photo)
- Nobody is told: the setting stays on your device. Nothing is written to Bluesky, and no follow or mute is used
Log in with ATOMO #
- ATOMO is what blusco calls ATProto OAuth. Bluesky's authorization page opens in a browser, and blusco never sees your password
- The ring: type your handle and your avatar appears in the ring. Press the button and the ring breathes while you authorize. See ATOMO
- Accounts: add more accounts in Settings and switch with a tap. Windows, drafts and blue dots are kept per account
- An app password still works, from “Use an app password” under the button
Also #
- Familiar faces: tap the icon on anyone's profile to add them to Familiar faces; the ring around the icon lights up blue. Long-press (right-click on Mac) to choose other windows. Nobody is told
- Edit: within 5 minutes and before any reactions, fix a post and keep its link. It shows "edited" and the time
- Moderation: Bluesky muted words, hidden posts, and content labels apply, set in three steps (Quiet, Standard, As is). blusco doesn't mute or block people itself
- Audio posts: attach audio to a post. It is uploaded as a blob and referenced by a
blue.moja.blusco.audioembed. Other clients show only the text
Build #
You need a Mac with Xcode. The Mac app runs on macOS 14.2 or later (translation needs macOS 15).
zsh app/build.sh
This builds blusco.app for Apple silicon and Intel, signs it ad hoc, and puts it in /Applications.
The iPhone app is not on the App Store. Sign the blusco iOS target in app/blusco.xcodeproj with your own Apple ID and install it on your iPhone.
Either way, log in with ATOMO (ATProto OAuth) in a browser. An app password also works. Passwords are not stored.
Notes #
- If AXIS Basic ProN is installed, blusco uses it. It is a commercial typeface and is not included; otherwise the system font is used
- Code comments are in Japanese
- The interface is available in Japanese and English
License #
MIT