Skip to content

Install Fulgoria

Fulgoria ships a thin server (server.js, Node/Express) that does only two things: it serves the static app and, optionally, gates it behind a login read from .env. The document itself is always processed 100% in the browser — the server never receives it, applies a strict CSP and security headers, and never exposes .env, server.js or any private samples.

Docker

Recommended for production. Use the prebuilt image or build locally with docker compose.

Node.js 18+

Required only if you run the server directly with npm instead of Docker.

A modern browser

All extraction (PDF parsing, OCR, editing) runs client-side, so a current browser is where the real work happens.

The fastest path is the image published to GHCR, built by CI on every push to main.

Terminal window
docker run -d \
-p 3000:3000 \
-e AUTH_ENABLED=true \
-e AUTH_USER=diego \
-e AUTH_PASSWORD='your-password' \
-e SESSION_SECRET="$(openssl rand -hex 32)" \
-e COOKIE_SECURE=false \
ghcr.io/diegoparras/fulgoria:latest

Then open http://localhost:3000.

  1. Open the app at http://localhost:3000 (or your configured host).
  2. If AUTH_ENABLED=true, sign in with AUTH_USER and the password you configured.
  3. Click Open PDF or image, or See an example to load a sample bank statement.
  4. Mark the columns, check the balance turns green, and export to CSV.

All configuration lives in .env (copy it from .env.example). The .env file is never committed and never served.

VariableDefaultDescription
PORT3000Port the thin server listens on.
AUTH_ENABLEDtrueSet to false to serve the app with no password (local or private-network use).
AUTH_USERdiegoUsername for the login.
AUTH_PASSWORD(empty)The password — plain text, or a bcrypt hash from --hash.
SESSION_SECRET(empty)Secret used to sign the session cookie. Generate with openssl rand -hex 32.
SESSION_TTL_HOURS12Session lifetime, in hours.
COOKIE_SECUREtrueKeep true behind HTTPS; set false only to test locally over http://.
ESCRIBA_URL(empty)Destination of the “Send to Escriba” button. Empty falls back to /. Point it at your Escriba, e.g. https://your-escriba.com/.