- TypeScript 98.2%
- HTML 0.9%
- CSS 0.9%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Saves, preflights and reconciles send profileId. The settings page lists each Source's profiles and stores the chosen ID; an adapter's dedicated profile is found by name until one is chosen, and an ambiguous name asks for a choice. Refreshes the schema snapshot and the mock server. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> |
||
| docs | ||
| extensions | ||
| packages/core | ||
| tools | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| tsconfig.base.json | ||
StuffApp Extensions
Browser extensions that save images and their metadata from specific websites into a StuffApp server. Firefox first, Chrome too, both Manifest V3, built with WXT.
StuffApp decides what is stored and how: each save is sent to a named StuffApp Content import configuration. The extensions supply the bytes and the site's metadata. See docs/ARCHITECTURE.md.
| Extension | Site | Notes |
|---|---|---|
extensions/e-hentai |
e-hentai.org | Galleries and single image pages |
extensions/nhentai |
nhentai.net | Galleries and reader pages, through nhentai's JSON API |
extensions/reddit |
reddit.com | Bulk imports of a user's posts, or your saved items (with nhentai codes) |
extensions/onlyfans |
onlyfans.com | Slow, pausable bulk imports of a creator you subscribe to (no DRM, no locked media) |
extensions/fixture-images |
local fixture site | Reference implementation to copy |
Status: works end to end in Firefox and Chromium against a mock of StuffApp's prototype import API, including a live e-hentai save. The real prototype did not compile when checked, so it has not been exercised yet. See docs/STUFFAPP_REQUIREMENTS.md.
Prerequisites
- Node.js ≥ 22 and pnpm 12
- A StuffApp server with the Content import API, and an import configuration that maps the
extension's source type (e.g.
e-hentai-image)
Develop
pnpm install
pnpm test
pnpm typecheck
Build and load the e-hentai extension in Firefox:
pnpm --dir extensions/e-hentai build # → extensions/e-hentai/.output/firefox-mv3
Open about:debugging#/runtime/this-firefox, choose Load Temporary Add-on…, and pick
.output/firefox-mv3/manifest.json. Then open the extension's settings, enter the StuffApp server
URL, choose Save and connect, and pick the import configuration. pnpm --dir extensions/e-hentai dev runs a live-reloading Firefox instead. For Chrome, use build:chrome and Load unpacked
.output/chrome-mv3.
Without a StuffApp server, run the mock: node tools/mock-stuffapp/src/server.ts (port 5199,
with configurations "E-Hentai", "nhentai", "Reddit" and "Fixture Site").
Each extension uses its own dedicated StuffApp import configuration by default (e.g. "E-Hentai"). See docs/configurations for each site's configuration and what it can and cannot capture yet.
Add a site
- Copy
extensions/fixture-imagestoextensions/<site-id>, rename the package, and set a newnameandgeckoIdinwxt.config.ts. The gecko ID must never change after release. - Write the adapter.
extensions/e-hentaiis the realistic example: a separateparse.ts, multi-page extraction, lazy media resolution with mirror retry, a site option, and pacing. - Give stored files a stable per-item name prefix (it drives the popup's "already saved" count), and document the metadata shape in the extension's README.
- Add synthetic fixtures that copy the site's markup structure with neutral content, and test against them.