No description
  • TypeScript 99.4%
  • Dockerfile 0.6%
Find a file
2026-09-11 20:05:24 +02:00
scripts project 2026-09-11 20:04:54 +02:00
src project 2026-09-11 20:04:54 +02:00
tests project 2026-09-11 20:04:54 +02:00
.dockerignore project 2026-09-11 20:04:54 +02:00
.env.example project 2026-09-11 20:04:54 +02:00
.gitignore project 2026-09-11 20:04:54 +02:00
bun.lock project 2026-09-11 20:04:54 +02:00
bunfig.toml project 2026-09-11 20:04:54 +02:00
CHANGELOG.md project 2026-09-11 20:04:54 +02:00
docker-compose.yml project 2026-09-11 20:04:54 +02:00
Dockerfile project 2026-09-11 20:04:54 +02:00
LICENSE.txt project 2026-09-11 20:04:54 +02:00
package.json project 2026-09-11 20:04:54 +02:00
README.md first commit 2026-09-11 20:04:31 +02:00
tsconfig.json project 2026-09-11 20:04:54 +02:00

FAExport

A Bun and TypeScript rewrite of FAExport. It converts FurAffinity's current modern-layout pages into the established JSON, XML, and RSS API.

Run locally

Requires Bun 1.3 or newer.

bun install
cp .env.example .env
bun run start

Redis is optional. Without REDIS_URL, a bounded in-process TTL cache is used. Set FA_COOKIE for public pages that FurAffinity makes login-only. Request-specific authenticated endpoints require an FA_COOKIE request header; the server cookie is not accepted as caller authorization.

curl -H 'FA_COOKIE: b=...; a=...' http://localhost:9292/notifications/submissions.json

HTTP Basic authentication remains compatible with RSS readers. Credentials embedded in feed URLs must never be shared. Reading an individual unread note may mark it read on FurAffinity.

Develop

bun run check
bun run dev

The deterministic suite does not access FurAffinity. Read-only live checks require LIVE_FA_TESTS=1 and explicit credentials. Favorite and journal mutations are never performed by the live suite.

The original Ruby implementation is retained in the ignored tmp/ directory as reference only and is not included in builds or images.

Docker

docker build -t faexport .
docker run --rm -p 9292:9292 --env-file .env faexport

docker compose up starts both FAExport and Redis, waits for Redis to become healthy, and uses the internal redis://redis:6379 address by default. Set REDIS_URL to override it with an external Redis instance.

License

BSD 3-Clause. Copyright remains with the original FAExport contributors; see LICENSE.txt.