This repository has no description
Something went wrong. Try again.
JavaScript 89%
CSS 9%
HTML 2%
README.md
Bsky+ Browser Extension #
Enhanced features for Bluesky (bsky.app) including Local OCR Alt Text, AI Image Descriptions, Media Downloader, Video Controls, Quick Emoji, Feed Width Slider, and Fresh Account Badges.
Supports Google Chrome, Mozilla Firefox, and Apple Safari.
Features #
1. One-Click Media Downloader #
- Download buttons overlaid directly on images, GIFs, and videos across feeds and post views.
- Automatically resolves full-resolution media from
cdn.bsky.app(transforms/feed_thumbnail/and/avatar_thumbnail/into/feed_fullsize/and/avatar/). - Downloads HLS video streams (
video.bsky.app) by fetching.m3u8playlists, combining segment buffers into MP4 format, and initiating instant file downloads. - Clean filename formatting:
[handle]_[YYYY-MM-DD].[ext].
2. Enhanced Media Viewer #
- Video playback speed controller toolbar (
0.5x,1x,1.25x,1.5x,2x). - Each new video starts at
1x; speed choices apply only to the current video. - Native Picture-in-Picture (PiP) toggle for watching videos while scrolling feeds.
- Persistent volume and mute memory saved in browser storage across video plays.
3. Quick Emoji Autocomplete & Fuzzy Search #
- Slack-style autocomplete when typing
:emoji_namein the post composer or replies (e.g.,:color,:rock,:rocket,:heart). - Full Unicode standard dataset with 1,870+ emojis and aliases.
- Fuzzy matching and typo tolerance (Levenshtein distance & subsequence scoring) for easy querying (
:rck$\rightarrow$ 🪨,:clor$\rightarrow$ 🎨,:samrok$\rightarrow$ ☘️,:hert$\rightarrow$ ❤️). - Keyboard navigable (
Up/Down/Enter/Tab/Escape) with click-to-insert.
4. Feed Width Slider #
- Customizes the center feed column width on desktop monitors from the default 600px up to 1200px.
- Adjust in real-time from the Bsky+ popup menu or reset back to default 600px anytime.
5. Account Age / "Fresh Account" Badge #
- Highlights newly created accounts with a
🌱 New (Xd)or⚠️ New (Xd)badge next to user handles to quickly spot bot/troll accounts. - Displays full account registration date in tooltips upon hovering.
- Efficiently cached in browser IndexedDB to avoid repetitive network requests.
- Paced and batched background requests (up to 25 accounts per request) with exponential backoff to respect Bluesky rate limits.
6. In-Browser Local OCR for Alt Text #
- Adds +OCR beside +ALT on each image preview in the post composer. It reads the selected image and saves its alt text directly, without opening the editor.
- The existing "Add with OCR" action is also available inside the Alt Text modal.
- 100% Client-Side / Local: Runs offline in the browser using Tesseract.js WebAssembly with zero external server calls.
- Toast Notifications: If an uploaded image contains no text (e.g. blank image or graphic), it immediately displays a floating toast:
"There was no text in the image".
7. Case-Preserving Skeet Mode #
- Automatically replaces all occurrences of the word
"post"/"posts"with"skeet"/"skeets". - Strictly maintains character casing:
POST→SKEETPost→SkeetpOsT→sKeEtpost→skeetposts→skeetsPOSTS→SKEETS
- When toggled off, reverts seamlessly without page reload.
8. Theme editor #
- Open Bsky+ settings → Theme editor (
/bskyplus/theme) to create a theme from a light, dim, or dark starting palette. - Customize surfaces, text and icons, borders and focus, links and primary controls, status and reactions, overlays and shadows.
- Changes appear in the preview. Save themes locally, use Save & apply to apply one across Bluesky tabs, or restore Use Bluesky default.
- Export or import a theme as versioned JSON. Imports are validated and loaded into the preview for review before saving or applying. Theme files contain only the name, ID, base, and colors.
- Import public
app.witchsky.theme.colorsAT records by URI. The base palette and every named variant are saved as separate themes. - Enable Preview changes on this page to try the current draft across the open Bluesky page without saving or applying it.
- Palette mapping covers recognized Bluesky CSS, inline styles, SVGs, and single-color fades. Images, multicolor artwork gradients, and unrecognized colors retain their originals.
- See the source audit and color groups for coverage and limitations.
9. Inline thread unroll #
- On a numbered thread beginning with Post 1 of X, select Unroll thread beside Thread options to read its posts together.
- Repeated author details and extra post controls are hidden. Each post keeps its native reply, repost, and like controls in a compact row, along with its text and attachments.
- Select Restore thread to return to the normal layout. Unrolling applies only to the current thread.
10. Edit recent posts #
- Edit post appears automatically in the options menu for your eligible posts; no settings toggle is required.
- Posts can be edited once, within 10 minutes of posting. Eligibility is checked again when saving.
- Existing attachments and the original text are preserved in the replacement record.
11. Feature Flags & Release Configuration #
Configurable features use a centralized feature flag system in extension/shared/feature-flags.js:
- Feature Stages:
'release': Production-ready, visible in settings, enabled by default.'alpha': In active development. Hidden from regular users on release builds. Accessible only when developer/alpha mode is enabled.'disabled': Completely disabled and suppressed across both UI and runtime.
- Dual-Layer Gating:
- Popup UI: Automatically hides toggles and sections for disabled/alpha features unless alpha mode is toggled.
- Content Scripts & Runtime: Content scripts check
isFeatureEnabled(featureName)before mounting DOM elements, listeners, or MutationObservers.
- Quick Release Configuration: Change a feature's stage directly in
FEATURE_FLAGSin [feature-flags.js](file:///Users/david/bskyplus/extension/shared/feature-flags.js) and runnpm run sync:shared.