No description
  • TypeScript 98.2%
  • HTML 0.9%
  • CSS 0.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Mobius bbd3508891 SA-314: Address StuffApp import profiles by ID
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>
2026-11-07 08:47:19 -08:00
docs SA-314: Address StuffApp import profiles by ID 2026-11-07 08:47:19 -08:00
extensions SA-314: Address StuffApp import profiles by ID 2026-11-07 08:47:19 -08:00
packages/core SA-314: Address StuffApp import profiles by ID 2026-11-07 08:47:19 -08:00
tools SA-314: Address StuffApp import profiles by ID 2026-11-07 08:47:19 -08:00
.gitattributes Scaffold StuffApp browser extensions monorepo 2026-10-03 15:47:16 -07:00
.gitignore Scaffold StuffApp browser extensions monorepo 2026-10-03 15:47:16 -07:00
AGENTS.md SA-314: Address StuffApp import profiles by ID 2026-11-07 08:47:19 -08:00
CLAUDE.md Scaffold StuffApp browser extensions monorepo 2026-10-03 15:47:16 -07:00
package.json Scaffold StuffApp browser extensions monorepo 2026-10-03 15:47:16 -07:00
pnpm-lock.yaml Add the OnlyFans importer extension 2026-10-26 11:22:15 -07:00
pnpm-workspace.yaml Scaffold StuffApp browser extensions monorepo 2026-10-03 15:47:16 -07:00
README.md Add the OnlyFans importer extension 2026-10-26 11:22:15 -07:00
tsconfig.base.json Scaffold StuffApp browser extensions monorepo 2026-10-03 15:47:16 -07:00

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

  1. Copy extensions/fixture-images to extensions/<site-id>, rename the package, and set a new name and geckoId in wxt.config.ts. The gecko ID must never change after release.
  2. Write the adapter. extensions/e-hentai is the realistic example: a separate parse.ts, multi-page extraction, lazy media resolution with mirror retry, a site option, and pacing.
  3. 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.
  4. Add synthetic fixtures that copy the site's markup structure with neutral content, and test against them.