A collection of enhanced features for FurAffinity that can be installed either as individual userscripts or as one browser extension (Chrome/Firefox).
Also find all mentioned Scripts on GreasyFork as individual userscripts.
Note
Visit docs here: https://midori-dragon.github.io/furaffinity-features/
| Table of Contents |
|---|
| 1. Overview |
| 2. Feature Modules |
| 3. Library Modules |
| 4. Installation |
| 5. Usage |
| 6. Development |
| 7. Contributing |
This project provides various quality-of-life improvements and additional features for Fur Affinity. It's built with TypeScript and can be used in two ways:
- As individual userscripts (using Violentmonkey, Tampermonkey, etc.)
- As a browser extension (Chrome and Firefox)
All feature and library modules are also bundled together as a single combined userscript — Furaffinity Features — available on GreasyFork. See the docs for details.
- Embedds the clicked image on the current page
- Works on galleries, favorites, scraps, search and browse pages
- Supports preview image
- Supports opening, faving and downloading images
- Infinite scrolling functionality for gallery pages.
- Works on gallery, favorites, scraps, search and browse pages
- Automatic loading of sequential comic pages.
- Auto-detection of comic navigation
- Searching for similar pages if navigation is not present
- Navigation button overwrite
- Instantly removes messages from the current page
- Supports removing messages from different categories
- Scan watches for new favorites
- Custom favorites page to view favorites from watches
- Ignore list management
- Show favorite source (which watcher)
- Duplicate favorites filtering
Quick image preview functionality that embeds images directly in the current page.
| Feature Roadmap | Status |
|---|---|
| Inline image preview without leaving the current page | ✅ Completed |
| Preview quality settings | ✅ Completed |
| Close after opening option | ✅ Completed |
| Works on galleries, favorites, search and browse pages | ✅ Completed |
| Copy image button for embedded viewer | ⬜ Planned |
Infinite scrolling functionality for gallery pages.
| Feature Roadmap | Status |
|---|---|
| Automatic page loading while scrolling | ✅ Completed |
| Customizable page separators | ✅ Completed |
| Works on gallery, favorites, scraps, and search pages | ✅ Completed |
| Loading animation integration | ✅ Completed |
Automatic loading of sequential comic pages.
| Feature Roadmap | Status |
|---|---|
| Auto-detection of comic navigation | ✅ Completed |
| Searching for similar pages if navigation is not present | ✅ Completed |
| Automatic page loading | ✅ Completed |
| Loading animations | ✅ Completed |
| Navigation button customization | ✅ Completed |
Instantly removes messages from the current page.
| Feature Roadmap | Status |
|---|---|
| Remove messages instantly | ✅ Completed |
| Remove messages from different categories | ✅ Completed |
Advanced system for monitoring and displaying favorites from watched users.
| Feature Roadmap | Status |
|---|---|
| Scan watches for new favorites | ✅ Completed |
| Custom favorites page | ✅ Completed |
| Ignore list management | ✅ Completed |
| Show favorite source (which watcher) | ✅ Completed |
| Duplicate favorites filtering | ✅ Completed |
| Loading animations | ✅ Completed |
| Integration with Embedded-Image-Viewer | ✅ Completed |
Central settings management system for all modules.
| Feature Roadmap | Status |
|---|---|
| Settings persistence | ✅ Completed |
| Multiple setting types (boolean, number, text, action) | ✅ Completed |
| Per-module settings management | ✅ Completed |
| New setting type combobox | ✅ Completed |
| Import and Export Settings | ✅ Completed |
Provides loading animations for various async operations.
| Feature Roadmap | Status |
|---|---|
| Customizable loading spinners | ✅ Completed |
| Speed control | ✅ Completed |
| Multiple animation styles | ✅ Completed |
URL matching system for conditional feature activation.
| Feature Roadmap | Status |
|---|---|
| Pattern-based URL matching | ✅ Completed |
| Support for multiple match patterns | ✅ Completed |
| iframe support configuration | ✅ Completed |
Handles API requests and data fetching.
| Feature Roadmap | Status |
|---|---|
| API request wrapper for common requests | ✅ Completed |
| Rate limiting | ✅ Completed |
| Request queuing | ✅ Completed |
| Error handling | ✅ Completed |
| Cross-module request management | ✅ Completed |
Custom image viewer component used to display submission images with preview support.
| Feature Roadmap | Status |
|---|---|
| Support preview image | ✅ Completed |
| Loading state management | ✅ Completed |
| Have different events for image loading | ✅ Completed |
| Zooming and panning via panzoom | ✅ Completed |
Helper library for creating custom pages on FurAffinity via URL parameters.
| Feature Roadmap | Status |
|---|---|
| Have basic Custom Pages | ✅ Completed |
| Support for url encoded parameters | ✅ Completed |
Library for showing styled message dialogs that match FurAffinity themes.
| Feature Roadmap | Status |
|---|---|
| Have MessageBox | ✅ Completed |
| Support different icon types | ✅ Completed |
| Support different button sets | ✅ Completed |
| Support FurAffinity color themes | ✅ Completed |
A collection of prototype extensions for String and Node.
| Feature Roadmap | Status |
|---|---|
| String extensions | ✅ Completed |
| Node extensions | ✅ Completed |
Internal shared utility classes and functions used across all modules (Logger, Semaphore, storage wrappers, FA DOM helpers, URL helpers).
| Feature Roadmap | Status |
|---|---|
| Cross-module compatibility layer | ✅ Completed |
| Common utility functions | ✅ Completed |
| Browser extension integration helpers | ✅ Completed |
| Logging and debugging utilities | ✅ Completed |
Shared utility functions and components used across other modules.
| Feature Roadmap | Status |
|---|---|
| Cross-module compatibility layer | ✅ Completed |
| Common utility functions | ✅ Completed |
| Browser extension integration helpers | ✅ Completed |
| Logging and debugging utilities | ✅ Completed |
- Install a userscript manager (Violentmonkey, Tampermonkey, etc.)
- Select and install desired feature modules from my Greasy Fork profile
- Configure module settings as needed
- Install from Chrome Web Store / Firefox Add-ons
- Enable desired features
- Configure extension settings
Visit the docs for a more detailed description.
By default all features are enabled. You can disable features by going to the Settings page and deactivating the desired features.
Settings can be found on Fur Affinity itself.
In the Settings dropdown menu there will be a new category Extension Settings with an option FurAffinity Features.
Here each Module can be configured separately.
Note
When used as a Browser Extension the Settings will be synced if you're logged into your Browser. Otherwise the Settings will be saved locally.
The project follows a modular architecture:
- Each feature is a standalone module
- Modules are organized into categories (modules, components, utils)
- Global utilities are shared across modules
- Each module can be used independently as a userscript
- Modules can utilize features from other modules (with proper dependencies declared)
- TypeScript for type-safe development
- ESLint for code quality
- Rollup for building and bundling
- Support for both userscript and browser extension formats
- Node.js
- npm/yarn
git clone https://github.com/MidoriDragon/furaffinity-features.gitcd furaffinity-featuresnpm installNote that each module has its own Rollup configuration. In this Rollup config the banner for the user script is defined.
Important
The banner is used by the build process to determine the modules dependencies!
When testing the Project as UserScript you can either manually copy the furaffinity-features.user.js file from the dist folder to the userscript manager or use the npm run serve command to host a local http server, where you can copy the link to the furaffinity-features.user.js file to use for the userscript manager. This method also allows the userscript manager to automatically update the userscript every time you build the project.
When testing the Project as Browser Extension you can use the npm run start:firefox or npm run start:chrome command to start the browser extension. This will start the browser and load the extension from the dist folder.
Note
UserScript Context is generally easier and faster to test. But Browser Extension Context is more restricted and may not work in all cases UserScript Context does.
Docs can be edited and then previewed by running npm run docs
Building command names can be found in package.json
npm run build:Browser-ExtensionTo do a full rebuild including all dependencies:
npm run build:Browser-Extension-RebuildIf you are happy with your changes, you can package the browser extension by running npm run package:Browser-Extension.
Contributions are welcome! Feel free to open issues and pull requests.
Please read CONTRIBUTING.md for more information.
