A (WIP) Bluesky client for Emacs.
- Secure authentication with Bluesky
- View your timeline with UTF-8 support (including emojis)
- Create posts and quote posts
- Reply to posts with proper threading
- Like and unlike posts
- Repost and unrepost posts
- Follow and unfollow users
- View notifications (likes, reposts, follows, mentions, replies, quotes)
- View user profiles with avatar, bio, stats, and follow status
- Clickable links in posts
- Auto-refresh timeline at configurable intervals
- Simple keybindings
-
Clone this repository:
git clone https://github.com/annapawlicka/bluemacs.el.git
-
Add to your Emacs configuration:
(add-to-list 'load-path "/path/to/bluemacs.el") (require 'bluemacs)
(use-package bluemacs
:load-path "/path/to/bluemacs.el"
:config
(setq bluemacs-auto-refresh-interval 60)) ; Optional: auto-refresh every 60 secondsBefore using bluemacs, you need to create an App Password (not your main Bluesky password):
- Go to https://bsky.app/settings/app-passwords
- Create a new app password
- Save it securely
M-x bluemacs-loginYou'll be prompted for:
- Your Bluesky handle (e.g.,
username.bsky.social), you can also use your email - Your app password
Note: Credentials are only stored in memory by default. See Saving Credentials to persist them.
M-x bluemacs-timelineThis opens a buffer displaying your Bluesky timeline.
In the timeline buffer:
| Key | Action |
|---|---|
g |
Refresh timeline |
c |
Compose new post |
r |
Reply to post at point |
Q |
Quote post at point |
l |
Like/unlike post at point |
R |
Repost/unrepost post at point |
f |
Follow/unfollow user |
t |
View thread/replies |
N |
View notifications |
P |
View user profile |
b |
Back to previous view |
a |
Toggle auto-refresh |
i |
Set refresh interval |
I |
Toggle image display |
q |
Quit window |
n |
Next line |
p |
Previous line |
? |
Describe mode (show help) |
SPC |
Scroll up |
DEL |
Scroll down |
< |
Beginning of buffer |
> |
End of buffer |
bluemacs maintains a navigation history stack, allowing you to browse through different views and return to where you came from:
- Press
bto go back to the previous view (timeline, thread, profile, or notifications) - The navigation stack remembers your scroll position in each buffer
- If the navigation stack is empty,
breturns to the timeline - You can navigate through multiple levels: timeline → thread → profile → back to thread → back to timeline
Example navigation flow:
- View timeline
- Press
ton a post to view its thread (timeline is saved to history) - Press
Pon a reply to view that user's profile (thread is saved to history) - Press
bto return to the thread view - Press
bagain to return to the timeline
bluemacs supports automatic timeline refreshing:
;; Set auto-refresh interval (in seconds)
(setq bluemacs-auto-refresh-interval 60) ; Refresh every 60 secondsFrom the timeline buffer:
- Press
ito set the refresh interval - Press
ato toggle auto-refresh on/off
Or use commands:
M-x bluemacs-set-refresh-interval
M-x bluemacs-toggle-auto-refreshNote: Auto-refresh only works when the timeline buffer is visible, so it won't waste resources in the background.
bluemacs allows you to compose and post text updates to Bluesky.
- Press
cin the timeline (or runM-x bluemacs-compose) - A compose buffer opens with instructions
- Write your post (max 300 characters)
- Press
C-c C-cto send orC-c C-kto cancel
M-x bluemacs-post RET
Post text: Your message here RETNote: Posts are limited to 300 characters. The package will validate length before posting.
Reply to any post in your timeline or in thread view:
- Navigate to the post you want to reply to
- Press
r(or runM-x bluemacs-reply) - A compose buffer opens showing which post you're replying to
- Write your reply (max 300 characters)
- Press
C-c C-cto send orC-c C-kto cancel
View conversation threads with all replies:
- Navigate to any post in the timeline
- Press
tto view the full thread - Replies are indented to show conversation hierarchy
- Press
bto go back to the timeline
Like or unlike any post with a single keypress:
- Navigate to the post you want to like
- Press
l(or runM-x bluemacs-toggle-like) - The timeline refreshes to show the updated like status
Repost (boost/retweet) any post to share it with your followers:
- Navigate to the post you want to repost
- Press
R(shift+r, or runM-x bluemacs-toggle-repost) - The timeline refreshes to show the updated repost status
Display format for reposts in timeline:
♻ Reposted by Alice Smith (@alice.bsky.social)
Bob Jones (@bob.bsky.social) - 2025-01-15 10:30
Post content here...
bluemacs can display embedded images inline when running in graphical Emacs.
Toggle images on/off:
- Press
I(capital i) in the timeline buffer - Or run
M-x bluemacs-toggle-images
Customize image size:
(setq bluemacs-image-max-width 600) ;; Default: 400
(setq bluemacs-image-max-height 400) ;; Default: 300Disable images by default:
(setq bluemacs-display-images nil)Note: Images only display in graphical Emacs. In terminal mode, alt text is shown instead.
bluemacs supports both viewing and creating quote posts.
Quote posts are automatically displayed in your timeline with a bordered box around the quoted content.
Usage:
- Navigate to a post that contains a quote (you'll see the bordered box)
- Move your cursor anywhere within the quoted post section
- Press
RET(Enter) to open the quoted post's full thread - View all replies, likes, and reposts for that quoted post
- Press
bto return to your timeline
Display format:
┌─ Quoted Post ─────────────────────────────────────────────────
│ Author Name (@handle) - [press RET to view thread]
│ Text of the quoted post...
│ [Images if present]
└───────────────────────────────────────────────────────────────
How to quote post:
- Navigate to the post you want to quote
- Press
Q(shift+q, or runM-x bluemacs-quote) - A compose buffer opens showing which post you're quoting
- Write your commentary (max 300 characters)
- Press
C-c C-cto send orC-c C-kto cancel
View your Bluesky notifications to see who has interacted with your posts:
M-x bluemacs-notificationsOr press N from the timeline buffer.
Features:
- View all your Bluesky notifications in a dedicated buffer
- Different icons for each notification type:
- ♥ Likes
- ♻ Reposts
- 👤 Follows
- @ Mentions
- ↩ Replies
- 💬 Quote posts
- Unread notifications are shown in bold text
- Press
ton any notification to view the full thread - Fetches the 50 most recent notifications
Display format:
♥ Alice (@alice.bsky.social) liked your post
Your post text here...
[2025-10-22T10:30:00Z] - press 't' to view thread
--------------------------------------------------------------------------------
View detailed user profiles including avatar, banner, bio, and statistics:
From timeline or thread:
- Navigate to any post
- Press
Pto view the author's profile
Or manually:
M-x bluemacs-view-profile RET username.bsky.social RETProfile display includes:
- Banner image (if available, in graphical Emacs)
- Avatar image (if available, in graphical Emacs)
- Display name and handle
- Follow status (Following, Follows you, or both)
- Bio/description
- Stats: post count, follower count, following count
- DID (Decentralized Identifier)
Note: Profile images only display in graphical Emacs. The profile information is shown in a dedicated buffer.
Follow or unfollow users to customize your timeline:
From a profile:
- View a user's profile (press
Pon any of their posts) - Press
fto follow or unfollow the user - The profile refreshes to show the updated follow status
From the timeline:
- Navigate to any post
- Press
fto follow or unfollow the post's author
By default, your password is not saved and you'll need to log in each time you restart Emacs. To save credentials securely:
Create ~/.authinfo:
echo "machine bsky.social login your.handle.bsky.social password your-app-password" > ~/.authinfo
chmod 600 ~/.authinfoCreate ~/.authinfo.gpg (requires GPG):
echo "machine bsky.social login your.handle.bsky.social password your-app-password" | gpg -c -o ~/.authinfo.gpgWith credentials saved, bluemacs-login will automatically use them without prompting.
;; Bluesky instance URL (default: "https://bsky.social")
(setq bluemacs-instance "https://bsky.social")
;; Number of posts to fetch (default: 50)
(setq bluemacs-timeline-limit 20)
;; Auto-refresh interval in seconds (default: nil, disabled)
(setq bluemacs-auto-refresh-interval 120)
;; Display embedded images (default: t)
(setq bluemacs-display-images t)
;; Maximum image dimensions in pixels
(setq bluemacs-image-max-width 400)
(setq bluemacs-image-max-height 300)(use-package bluemacs
:load-path "/path/to/bluemacs.el"
:custom
(bluemacs-timeline-limit 15)
(bluemacs-auto-refresh-interval 90)
:config
(message "bluemacs loaded!"))| Command | Description |
|---|---|
bluemacs-login |
Log in to Bluesky |
bluemacs-logout |
Log out from current session |
bluemacs-timeline |
Fetch and display timeline |
bluemacs-refresh-timeline |
Refresh the current timeline |
bluemacs-notifications |
View notifications |
bluemacs-compose |
Compose a new post in buffer |
bluemacs-post |
Post text from minibuffer |
bluemacs-reply |
Reply to post at point |
bluemacs-quote |
Quote post at point with commentary |
bluemacs-toggle-like |
Like or unlike post at point |
bluemacs-toggle-repost |
Repost or unrepost post at point |
bluemacs-toggle-follow |
Follow or unfollow user at point |
bluemacs-view-thread |
View thread/replies for post at point |
bluemacs-view-quoted-post |
View thread for quoted post at point |
bluemacs-view-profile |
View user profile |
bluemacs-back-to-timeline |
Return to previous view or timeline |
bluemacs-toggle-auto-refresh |
Toggle auto-refresh on/off |
bluemacs-set-refresh-interval |
Set auto-refresh interval |
bluemacs-toggle-images |
Toggle image display on/off |
- Emacs 27.1 or higher
json(built-in)url(built-in)auth-source(built-in)
- Always use App Passwords, never your main Bluesky password
- Encrypt your authinfo file using
.authinfo.gpginstead of plain.authinfo - Set proper file permissions:
chmod 600 ~/.authinfoor~/.authinfo.gpg - Access tokens are stored in memory and are cleared when you restart Emacs or run
bluemacs-logout
Completed features:
- Compose and post new text skeets
- Thread view
- Reply to posts
- Like posts
- Repost posts
- Display quote posts
- Create quote posts
- Display repost attribution in timeline
- Follow and unfollow users
- Notifications
- View user profiles
Future features planned:
- View recent posts when viewing profile
- View user profile from follow notification
Contributions are welcome! Please feel free to submit issues or pull requests.
See LICENSE file for details.
- Repository: https://github.com/annapawlicka/bluemacs.el
- Bluesky: https://bsky.app
- AT Protocol Documentation: https://atproto.com