Back to tools

N3X Remiza

A self-hosted panel for volunteer fire brigades to manage members, equipment, vehicles, deadlines, operations and photographic records.

SELF-HOSTED OSPv0.1.3

An organized brigade. Available on every device.

N3X Remiza moves everyday volunteer fire department records into a modern web panel. Every person uses an individual account while members, equipment, deadlines and activities remain in a private PostgreSQL database on the department's server.

Data on the brigade's server · no public PostgreSQL port · no application telemetry

Application interface

A real product interface — open any preview to inspect it at full size.

1 / 2

Fire station command center

Members, vehicles, equipment, schedules and current operations visible immediately after sign-in.

Managed hosting by N3X

Want to use it without maintaining the server?

N3X can deploy and maintain this application, from initial setup and SSL to updates, monitoring and backups.

Ask about N3X hosting

The foundation of a digital fire station

Members and readiness

Member records, status, membership type and medical validity dates without storing diagnoses or unnecessary sensitive data.

Equipment and vehicles

Inventory, ownership, location, asset numbers, readiness status and inspection dates in one register.

Operations and call-outs

Fires, local hazards, false alarms, exercises, training and administrative trips with a clear history.

Calendar and reports

A shared calendar combines events with medical and inspection dates, while ready-to-use PDF and CSV reports use the current records.

Photos and documentation

Private photos and PDF files can be linked to an activity or event, described, downloaded and verified with a SHA-256 checksum.

Computer, tablet and phone

A responsive interface and PWA manifest make the panel usable at the station, in a vehicle and away from a desktop.

Accounts, roles and audit

Individual accounts, secure HttpOnly sessions, team-ready roles and an audit trail for the most important operations.

DOCKER COMPOSE

A private stack for the brigade

One configuration starts the panel, worker and PostgreSQL. The database password and materials remain in private volumes and only the application port is exposed.

N3X Remiza Web — dashboard, first-run setup and authentication
N3X Remiza Worker — administrative deadlines and session cleanup
PostgreSQL 17 — private brigade records and audit history
Your reverse proxy — HTTPS, a custom domain, or VPN/LAN-only access

DOCKER CONFIGURATOR

Compose tailored to your fire station

Set the domain, bind address, port and image version. The configurator prepares a ready-to-use Docker Compose file and startup commands — without an .env file.

The domain must point to the brigade's reverse proxy. Do not include https:// or a path.

0.0.0.0 provides LAN and proxy access. Use 127.0.0.1 when the proxy runs on the same host and the port should remain local.

The panel port available to the LAN or reverse proxy. The default is 8791.

Keep latest for the newest release or pin a specific version.

The first account is created in the web panel. After startup, open http://SERVER_IP:8791 and create the owner account immediately. Before Internet access, restrict the port with a firewall and enable HTTPS through a reverse proxy. Create consistent backups of postgres_data, runtime_secrets and attachments_data.
Public address
https://remiza.example.com
First-run address
http://DOCKER_SERVER_IP:8791
Reverse proxy target
http://DOCKER_SERVER_IP:8791
Health check
http://127.0.0.1:8791/api/health

Ready-to-use docker-compose.yml

name: n3xremiza

x-app-environment: &app-environment
  N3XREMIZA_DATABASE_PASSWORD_FILE: /run/n3xremiza/database_password
  N3XREMIZA_GEOCODING_BASE_URL: ${N3XREMIZA_GEOCODING_BASE_URL:-https://photon.komoot.io}
  N3XREMIZA_GEOCODING_BBOX: ${N3XREMIZA_GEOCODING_BBOX:-14.122,49.002,24.145,54.835}
  N3XREMIZA_TRUST_PROXY_HOPS: ${N3XREMIZA_TRUST_PROXY_HOPS:-0}
  N3XREMIZA_AUTH_AUDIT_RETENTION_DAYS: ${N3XREMIZA_AUTH_AUDIT_RETENTION_DAYS:-365}
  TZ: Europe/Warsaw

x-app-security: &app-security
  read_only: true
  security_opt:
    - no-new-privileges:true
  cap_drop:
    - ALL
  tmpfs:
    - /tmp:size=64m,mode=1777
    - /app/.next/cache:size=128m,mode=0700,uid=1001,gid=1001

services:
  bootstrap:
    image: alpine:3.22
    restart: "no"
    command:
      - /bin/sh
      - -ec
      - |
        umask 077
        if [ ! -s /run/n3xremiza/database_password ]; then
          od -An -N32 -tx1 /dev/urandom | tr -d ' \n' > /run/n3xremiza/database_password
        fi
        chmod 0444 /run/n3xremiza/database_password
    volumes:
      - runtime_secrets:/run/n3xremiza
    networks:
      - backend
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL

  web:
    image: ghcr.io/nexitpl/n3xremiza:latest
    pull_policy: always
    restart: unless-stopped
    depends_on:
      bootstrap:
        condition: service_completed_successfully
      postgres:
        condition: service_healthy
    environment: *app-environment
    volumes:
      - runtime_secrets:/run/n3xremiza:ro
      - attachments_data:/app/data/attachments
    ports:
      # Keep this port behind a host firewall until the owner account exists.
      # For Internet access, place the app behind an HTTPS reverse proxy.
      - "0.0.0.0:8791:3000"
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:3000/api/health"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - frontend
      - backend
    <<: *app-security

  worker:
    image: ghcr.io/nexitpl/n3xremiza:latest
    pull_policy: always
    restart: unless-stopped
    depends_on:
      bootstrap:
        condition: service_completed_successfully
      postgres:
        condition: service_healthy
      web:
        condition: service_healthy
    environment: *app-environment
    volumes:
      - runtime_secrets:/run/n3xremiza:ro
    command: ["node", "dist/worker.mjs"]
    networks:
      - backend
    <<: *app-security

  postgres:
    image: postgres:17-alpine
    restart: unless-stopped
    depends_on:
      bootstrap:
        condition: service_completed_successfully
    environment:
      POSTGRES_DB: n3xremiza
      POSTGRES_USER: n3xremiza
      POSTGRES_PASSWORD_FILE: /run/n3xremiza/database_password
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - runtime_secrets:/run/n3xremiza:ro
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n3xremiza -d n3xremiza"]
      interval: 5s
      timeout: 5s
      retries: 12
    networks:
      - backend

networks:
  frontend:
  backend:
    internal: true

volumes:
  postgres_data:
  runtime_secrets:
  attachments_data:

Start and health check

mkdir -p n3xremiza
cd n3xremiza
# Save the copied configuration as docker-compose.yml
docker compose up -d
docker compose ps
curl -fsS http://127.0.0.1:8791/api/health

Changelog

    • NewPhotos and PDF documents attached to operations and events, with access control, file limits and SHA-256 checksums.
    • NewAn interactive operations map with address suggestions, device geolocation and manual incident placement.
    • NewThe brigade's own location and a fire-station map layer alongside the incident-type legend.
    • NewHolidays and dates relevant to volunteer fire brigades in the calendar, plus archiving of incorrectly added operations.
    • ImprovementA refined mobile layout, fixed desktop sidebar and consistent current-release messaging on the product page.
    • ImprovementA dedicated app icon and fire-service N3X interface variant with clear active-section states on desktop and mobile.
    • NewIndividual user accounts, roles and per-module permissions.
    • NewUser administration with password resets, account blocking and active-session management.
    • NewAn activity log covering sign-ins, data changes, deletions and report exports.
    • NewA monthly calendar with one-off and recurring events plus deadline reminders.
    • NewPDF reports and CSV exports for members, assets and operations.
    • ImprovementA complete Polish and English interface with phone-optimised navigation.
    • ReleaseFirst self-hosted release deployed with Docker Compose: web panel, worker and PostgreSQL.
    • NewCore records for the brigade, members, equipment, vehicles, deadlines and operations.
Not an alerting system. Notifications cover administrative deadlines. N3X Remiza does not replace dispatch systems, SMS alerting or any operational department mobilisation channel.

USER GUIDE

N3X Remiza user guide

Installation, getting started, settings and troubleshooting.

N3X Station

N3X Station is a workspace for volunteer fire departments: members, equipment, vehicles, activities, a calendar and records.

Early MVP: keep independent department records. This app is not an operational emergency-alert system.

Requirements and installation

You need a server with Docker Compose and a browser. Remote access requires HTTPS or a trusted VPN.

  1. Download docker-compose.yml into a dedicated directory on the server.
  2. Run these commands in that directory:
docker compose up -d
docker compose ps
  1. Open http://SERVER_IP:8791 from a trusted network.
  2. Enter the department details and create the owner account.

No .env file is required. The database password is generated automatically and PostgreSQL stays on the internal network. Do not expose port 8791 directly to the internet.

Getting started

Add users and grant access to the appropriate modules. Complete records and deadlines for examinations, qualifications and inspections. Attach photos and documents to the relevant records.

Each file can be up to 10 MB, a record can have 25 active attachments and a department can store up to 1 GB of materials. Photos retain EXIF metadata; consider included device or location details before uploading.

Maps and address lookup use external services. Queries and coordinates go to the configured geocoding service. Device location is requested once, with the user's consent.

Backups and updates

Take consistent backups of postgres_data, runtime_secrets and attachments_data: the database, its password and original attachments. Keep backups off the server and test restoration.

After backing up, review release notes and any Compose changes, then run:

docker compose pull
docker compose up -d
docker compose ps

Keep persistent volumes. After updating, check sign-in, records and attachments.

Mobile and troubleshooting

The app runs in a browser or as a PWA added to the home screen. Authenticated data requires a network connection; the PWA is not an offline copy of department records.

For problems, check docker compose ps and docker compose logs --tail=100 web worker. For missing module access, check the user's role. For failed attachments, check application and reverse-proxy limits.