A simple browser extension that allows you to quickly save images from any webpage to your Are.na boards.
This extension adds a small save icon ("**") when you hover over images on most websites. Clicking the icon initiates a process to save that image to one of your Are.na boards.
After clicking the save button, a board selector appears allowing you to choose where to save the image:
- Hover-to-Save: An overlay appears on image hover, providing a quick save button.
- Are.na Authentication: Securely connects to your Are.na account using OAuth 2.0 (Authorization Code flow). You only need to log in once.
- Board Selection UI: After clicking the save button, a UI appears within the overlay allowing you to:
- View your 3 most recently updated Are.na boards (fetched initially when the list is empty).
- See the list update dynamically as you save items using the extension.
- Search for any of your boards by name.
- Visual Feedback: The save button provides visual cues for loading, success (✅), failure (❌), and authentication required (🔑).
- Download the latest
arena-clipper-chrome.zip
from the Releases page - Extract the zip file
- Open Chrome/Edge and navigate to
chrome://extensions
oredge://extensions
- Enable "Developer mode"
- Click "Load unpacked" and select the extracted folder
- Download the latest
arena-clipper-firefox.zip
from the Releases page - In Firefox, open
about:addons
- Click the gear icon and select "Install Add-on From File..."
- Select the downloaded zip file
To install this extension locally for development:
- Clone or download this repository
- Install dependencies:
pnpm install
ornpm install
- Start the development server:
- For Chrome/Edge:
pnpm dev
ornpm run dev
- For Firefox:
pnpm dev:firefox
ornpm run dev:firefox
- For Chrome/Edge:
This will automatically compile the TypeScript code and load the extension into your browser. The extension will reload when you make changes to the source code.
Before the authentication flow can work, you need to replace the placeholder Are.na Client ID:
- Register a new application with Are.na developers: https://dev.are.na/oauth/applications
- Set the "Redirect URI" for your application during registration. You can find the correct redirect URI for your specific browser and installation by:
- Loading the extension temporarily (as described above).
- Opening the background script console (see Debugging below).
- Looking for the log message
Are.na Background Redirect URL: ...
near the top. Copy this value exactly.
- Open the file
src/background.ts
. - Find the line
const CLIENT_ID = "ZMhCuoCSLMPEEHAv-ouY1Lk36bTwV-iNbJkL_q7zAjs";
(or similar). - Replace the placeholder string with your actual Client ID obtained from Are.na.
- Important: Reload the extension in your browser after making this change.
- Manifest Files:
manifest.json
: Manifest V3 for Chrome/Edge.manifest.firefox.json
: Manifest V2 for Firefox.
- Source Directory (
src/
):background.ts
: Handles authentication flow (OAuth) and securely provides the API token to content scripts.arena-api.ts
: Module for interacting with the Are.na API (fetching user info, channels, saving blocks) and managing local storage for the API token and the recent boards list (populateInitialRecentBoards
,getRecentBoards
,saveToBoard
,searchArenaBoards
).content/
: Scripts and styles injected into web pages.core-overlay.ts
: Responsible for creating and managing the visual overlay (calculating position, creating save button with icon/status elements, handling hover/mouseout logic) and the board selector UI (displaying recent/search results, handling selection/cancel/click-outside).arena-handler.ts
: Coordinates the user interaction flow triggered by the save button click. Manages button states (loading, success, error, etc.), orchestrates calls toarena-api.ts
(ensuring token, populating initial recents, getting recents, saving), and invokes theshowBoardSelector
UI fromcore-overlay.ts
.
style.css
: CSS styles for the injected UI elements (overlay, button, board selector, lists, input).
- Assets:
arena-logo.svg
,icon48.png
,icon128.png
.
- Content Scripts: Open the regular Developer Tools (F12) on any webpage where the extension is active. Logs from
core-overlay.ts
andarena-handler.ts
will appear in the Console tab. - Background Script:
- Chrome/Edge: Go to
chrome://extensions
oredge://extensions
, find the extension, and click the "service worker" link. - Firefox: Go to
about:debugging#/runtime/this-firefox
, find the extension, and click the "Inspect" button.
- Chrome/Edge: Go to
To create distributable .zip
packages for each browser:
-
Build for Chrome (Manifest V3):
pnpm run build:chrome # or npm run build:chrome
This command will:
- Clean the previous build output (
dist/
directory). - Run the TypeScript compiler (
tsc
) for type checking. - Run
vite build
usingmanifest.json
. - Create a
arena-clipper-chrome.zip
file in the project root containing the built extension.
- Clean the previous build output (
-
Build for Firefox (Manifest V2):
pnpm run build:firefox # or npm run build:firefox
This command will:
- Clean the previous build output (
dist/
directory). - Run the TypeScript compiler (
tsc
) for type checking. - Run
vite build
usingmanifest.firefox.json
(via theBROWSER=firefox
environment variable). - Create a
arena-clipper-firefox.zip
file in the project root containing the built extension.
- Clean the previous build output (
These .zip
files are suitable for uploading to the Chrome Web Store and Mozilla Add-ons (AMO) respectively.
This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0).
This means you are free to:
- Share — copy and redistribute the material in any medium or format
- Adapt — remix, transform, and build upon the material
Under the following terms:
- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made
- NonCommercial — You may not use the material for commercial purposes
For the full license text, see CC BY-NC 4.0.
- Twitter: @vldsvrk
- Website: vladsavruk.com