Skip to content

Latest commit

Β 

History

234 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Panorama

One open-source platform for IT assets + operational fleet β€” laptops, vehicles, licenses, equipment, in one pane. Multi-tenant Postgres RLS, OIDC, hash-chained audit trail, trilingual EN/PT-BR/ES. AGPL-3.0 (fork-friendly). Free hosted preview coming.

One pane of glass for laptops, licences, phones, forklifts, vans, and everything in between.


🌐 Read this in another language


Why Panorama?

Most teams that manage both IT assets (laptops, licenses, phones) and operational equipment (vehicles, forklifts, tools) end up running two separate systems β€” two databases, two auth surfaces, two audit trails, duplicate users, and a brittle integration between them.

Panorama is one platform for both. Single domain model, single data plane, single admin surface. Multi-tenant from construction (Postgres RLS forced at every tenant-scoped table). Hash-chained, tamper-detected audit log. Trilingual UI from day one (EN/PT-BR/ES). Self-host or use the hosted preview.

Status

🚧 Early access β€” open for use, expect rough edges. Bootstrapped 2026-04-17.

  • Backend: production-ready (NestJS 11 + Prisma 6 + Postgres RLS + OIDC end-to-end tested via #92). Dependency surface current through 2026-05-09 (#123).
  • Web app: in active build. ~10% of feature surface today; nav + asset CRUD + checkout forms in flight (#52).
  • Hosted preview: opening when Wave 0 readiness closes (Privacy + ToS + status page + audit-chain fix + data-export endpoint).

Architecture decisions in docs/adr/; current state + wave plan in docs/audits/HANDOFF-2026-05-09-session-end.md.

Project health & audit trail

A three-wave QA/QC audit was completed on 2026-04-23 covering security, architecture, data, UX, ops, product strategy, supply-chain, and AI/MCP exposure. 126 findings documented; most high/medium-priority items resolved across the audit-resolution sprint and the 2026-05-09 deps + Supabase staging session.

Latest handoff with current wave plan: docs/audits/HANDOFF-2026-05-09-session-end.md Original audit punch list: docs/audits/HANDOFF-2026-04-23.md. Wave reports under docs/audits/; filter open issues by audit:wave-1, audit:wave-2, or audit:wave-3.

Editions

Edition License Source Use case
Community AGPL-3.0 This repo Full self-hosting for any size team, no feature gating on core flows
Enterprise Commercial Private repo panorama-enterprise (pulled at build time) SSO connectors for niche IdPs, SOC-2 audit packs, white-label, 24Γ—7 support
Hosted preview Free (early access) Run by us Free hosted instance for evaluation; opening when Wave 0 readiness closes (see latest handoff)

The Community edition is the reference implementation β€” everything in it must work end-to-end without Enterprise code. Enterprise is additive, never subtractive.

Feature pillars β€” what's shipped vs. building vs. planned

Shipped = works end-to-end today. Building = in active development for 0.3. Planned = on the roadmap (0.4+); cite the version next to the feature.

Pillar Status (0.3-pre-pilot, 2026-04-26)
Assets Shipped: core schema, Categories, Manufacturers, Models, tag prefix, vehicle fields. Planned (0.4+): Snipe-IT parity for Custom Fields & Fieldsets, Suppliers, Depreciation, Status Labels, Acceptance / EULA.
Bookings Shipped: advance reservation with approval workflow, basket (multi-asset), blackouts, conflict detection under FOR UPDATE SERIALIZABLE. Building: blackout management UI, overdue detection sweep + UI signal. Planned (0.4+): recurring reservations, training compliance gating, configurable approval matrices.
Inspections Shipped: configurable templates (per-tenant), photo evidence with EXIF strip, snapshot-based item versioning, FAIL-review workflow, photo retention sweep. Planned (0.4+): signature capture, offline-first on mobile, pre/post comparison.
Maintenance Building: manual ticket open / list / close + asset-status flip (ADR-0016 step 3+). Planned (0.4+): auto-suggest from FAIL inspection or damage flag, mileage/time-based PM alerts, vendor-side portal.
People Shipped: Users, TenantMembership with role + status, OIDC + email/password auth, invitation flow. Planned (0.4+): SCIM 2.0, IdP-driven group mapping. SAML/LDAP not on roadmap pre-1.0 β€” see PILOT-SCOPE-LOCK-2026-04-26.md.
Multi-tenancy Shipped: Postgres RLS at query layer, panorama.current_tenant GUC enforced via runInTenant, FORCE RLS on every tenant-scoped table, cross-tenant FK trigger.
Auth Shipped: OIDC (Google + Microsoft Entra) with email_verified gate + Workspace hd override, email/password with argon2id, Personal Access Tokens for Snipe-IT compat. Planned (0.4+): SAML, WebAuthn.
Notifications Shipped: internal event bus (panorama.*.*), per-event channel registry, hash-chained tamper-audit, invitation email channel. Planned (0.4+): Slack/Teams/PagerDuty connectors, webhook delivery with HMAC, reservation lifecycle emails.
Reports Planned (0.4+): save-as-view, schedule, email; CSV/XLSX/PDF export. Nothing shipped today.
Labels/Barcodes Planned (0.4+): server-side SVG rendering, per-tenant templates. Nothing shipped today.
Importers Shipped: CSV importer + panorama-migrator CLI with adapters for upstream IT-asset and fleet systems.
API Shipped: REST under NestJS, typed OpenAPI auto-generated. PAT-authenticated compatibility shim for legacy IT-asset clients. Planned (0.4+): webhooks with HMAC. GraphQL is not on the roadmap β€” REST + OpenAPI is the contract.
Observability Shipped: structured JSON logging via Pino, audit-event hash chain, vitest coverage threshold. Planned (0.4+): OpenTelemetry tracing, Prometheus metrics, slow-query baseline runner.
i18n Shipped: EN/PT-BR/ES framework + CI gate (every key must exist in all three locales). Building: ~80% of web strings still hardcoded English; the migration to fully-translated UI lands during pilot prep.

Architecture at a glance

+--------------------+
| apps/web (Next.js) |   apps/admin and apps/mobile are 0.4+ β€” not yet
+---------+----------+   committed; the web app handles admin flows today.
          |
          +-------- REST + OIDC session, /api/* proxy --------+
                                    |
                       +------------v-------------+
                       |  apps/core-api (NestJS)  |
                       |  domain modules + Prisma |
                       +------------+-------------+
                                    |
      +-----------+----------+------+------+---------------+
      |           |          |             |               |
   Postgres    Redis     Object Store   MailHog (dev)   BullMQ
   (Prisma,   (rate-     (MinIO; S3       SMTP relay     (in-process,
   RLS, GUC)  limits,     in prod)        outbound        Redis-backed)
              queues)                     email)

OpenSearch + NATS / event bus + plugin SDK runtime are 0.4+ targets, not shipped today. See docs/audits/PILOT-SCOPE-LOCK-2026-04-26.md for the explicit won't-ship-for-pilot list.

Deployment topologies:

  • Single-node Docker Compose β€” infra/docker/compose.dev.yml for dev, compose.prod.yml for self-hosted. Shipped today.
  • Supabase / managed Postgres β€” design landed (ADR-0013 + 0015), staging not yet provisioned. 0.3 deploy-prep work in progress.
  • Kubernetes + Helm, Terraform blueprints β€” 0.4+, not started.

See docs/adr/0001-stack-choice.md for the stack rationale, docs/adr/0013-staging-deploy-architecture.md for deploy planning, and docs/audits/HANDOFF-2026-04-23.md for the prioritised pre-pilot punch list.

Getting started (dev)

Full 5-minute walkthrough β€” clone, seed, log in as a tenant Owner, test cross-tenant isolation β€” at docs/en/quickstart.md.

The TL;DR:

# Pre-req: Node 22+, pnpm 9+, Docker, Docker Compose v2
corepack enable
pnpm install
cp apps/core-api/.env.example apps/core-api/.env
cp apps/web/.env.example apps/web/.env.local
docker compose -f infra/docker/compose.dev.yml up -d
pnpm --filter @panorama/core-api prisma:deploy
pnpm --filter @panorama/core-api prisma:seed   # creates Owners + dev passwords
pnpm dev                                       # core-api + web concurrently

Then log in at http://localhost:3000/login with:

  • admin@alpha.example / panorama-dev-2026
  • admin@bravo.example / panorama-dev-2026

(Dev-only passwords β€” the seed refuses to run against a prod-looking DATABASE_URL.)

URL What it is
http://localhost:3000 Web app
http://localhost:4000/health Core API liveness + DB ping
http://localhost:4000/api/docs OpenAPI Swagger UI
http://localhost:8025 MailHog (captured outgoing emails)
http://localhost:9001 MinIO console (minioadmin/minioadmin)

Contributor security note: if you use Cursor / Claude Desktop / any AI tool with MCP servers configured against this repo, read docs/runbooks/dev-environment-ai-tooling.md before running anything. The runbook lists the verified MCP server allowlist and the incident-response path.

For production deployment (TLS, backups, hardening), see docs/en/self-hosting.md β€” different audience.

Importing data from another system

If you're coming from another IT-asset or fleet system, Panorama ships a CSV importer plus a panorama-migrator CLI in packages/migrator that adapts common upstream shapes (API + MySQL dump readers) into Panorama fixtures. Existing integrations can keep working during transition via the PAT-authenticated compatibility API shim.

See packages/migrator/README.md for the current adapter list and CLI flags.

Contributing

See CONTRIBUTING.md. Short version:

  1. Open an issue or pick one from the roadmap first
  2. Small PRs, clear commit messages (Conventional Commits), no 1,000-line drops
  3. Every user-facing string must be in packages/i18n/{en,pt-br,es} β€” we block PRs that hardcode English
  4. Every DB change must ship a Prisma migration plus a rollback note
  5. Every new feature must declare its edition tier: community or enterprise

License

Community edition is AGPL-3.0-or-later. The AGPL clause is deliberate β€” if you run a hosted SaaS that modifies Panorama, you must share your changes. Enterprise modules live in a separate private repo under a commercial licence.

See LICENSE and docs/en/licensing.md.

Code of conduct

Contributor Covenant 2.1.

Credits

  • Derived from work on SnipeScheduler-FleetManager by Vitor Rodovalho, itself a fork of SnipeScheduler by Ben Pirozzolo.
  • Feature coverage mapped against Snipe-IT (AGPL-3.0, Β© Grokability Inc.).
  • Thanks to the OSS projects we depend on β€” see THIRD_PARTY_NOTICES.md at release time.

About

Unified open-source platform for IT asset + operational fleet management. Successor to Snipe-IT + SnipeScheduler-FleetManager. Trilingual (EN/PT-BR/ES), AGPL-3.0.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages