ASafarIMShowcase
05 /Engineering proof

What actually backs this platform

Architecture, security boundaries, deployment shape, shipped versions, and quality status — each with a source and a timestamp, not just an assertion. Operational details (hosts, credentials, internal logs) are deliberately excluded.

← Back to showcase
01 /Architecture

How the pieces connect

BrowserReverse proxyTLS + subdomain routingMatched appNext.js, one per productShared PostgresPrisma — 7 appsIsolated PostgresDrizzle — testora, appbuilder onlyHTTPSroutesshared appsisolated apps, never shared
Every request crosses the same reverse proxy regardless of which app it reaches. What actually keeps testora and appbuilder isolated is that their apps never hold a connection to the shared database — not an application-level check.
Hub
experience

Central sign-in gateway; every app redirects here when unauthenticated.

Web / Showcase / Admin / Vionto / EduMatch / TimelineAI
experience

Next.js 16 App Router apps sharing the design system and auth cookie.

@asafarim/auth
shared

Auth.js v5 config, JWT sessions, RBAC helpers, app registry.

@asafarim/ui
shared

CSS design tokens, AppShell, DataTable, and brand components.

@asafarim/shared-i18n
shared

Locale resolution and dictionaries for en/nl/fr/de/lb.

@asafarim/db (Prisma)
data

Shared platform schema: users, RBAC, audit log, EduMatch, TimelineAI.

Testora / AppBuilder databases (Drizzle)
data

Per-app isolated Postgres instances, deliberately not shared.

Redis + BullMQ
data

Background job queues for Vionto's render pipeline and AppBuilder's AI generation.

02 /Security

SSO and RBAC boundaries

BrowserAppHubShared DBGET /dashboard302 → hub.* (no session)sign inverify credentials, load roles302 + Set-Cookie(JWT), domain=.asafarim.comGET /dashboard + cookiecheck permission — every request, server-side200 OK
The two highlighted hops are the actual security boundary: the cookie is scoped to the shared domain (not a token any single app controls), and the permission check re-runs against the shared database on every request — a role never travels as a trusted client-side flag.
Single sign-on, shared cookie

Hub issues a JWT session on a cookie scoped to the shared apex domain. Every other app validates that session; none of them hold a separate credential store.

RBAC is checked server-side, per app

Role/permission checks run in each app's own middleware and API routes against the shared platform schema — a client-side role flag is never trusted for access control.

Isolated databases stay isolated

Testora and AppBuilder each run against their own Postgres instance specifically so a bug in one app's queries can't reach platform user data.

Secrets never leave the server boundary

API keys and connection strings are decrypted server-side from an age-encrypted file at deploy time; they are not present in any client bundle or public repository file.

03 /Deployment

Delivery topology

Summary

Docker Compose stack behind a reverse proxy, deployed by pushing to main. Each app builds as its own standalone Next.js image; a background worker process runs alongside the apps that need one (Vionto, AppBuilder).

  1. GitHub Actions triggers on push to main.
  2. The deploy job connects over SSH to the host and runs the repository's deploy script.
  3. The script pulls the latest commit, decrypts environment secrets from the committed encrypted file, and rebuilds images sequentially.
  4. The reverse proxy routes each subdomain to its container; the stack restarts with zero manual steps.

Host address, credentials, and internal service ports are intentionally not published here — see the Rules section above.

04 /Live status

Is it actually up right now

Polled from each app’s public /api/status endpoint at the moment you loaded this page — genuinely live, not a cached number.

Webunreachable
Hubok · 7ms
Showcaseok · 7ms
Adminok · 7ms
Viontook · 7ms
Testoraok · 7ms
AppBuilderok · 7ms
EduMatchok · 7ms
TimelineAIok · 6ms
05 /Quality

Build, accessibility, performance

Build / lint / typecheck
Live

Passing

Method: GitHub Actions API: latest completed run of ci-status.yml on main (lint + typecheck + package tests — build excluded, needs CI secrets, tracked separately).
As of 2026-09-02

Accessibility snapshot
Live

96 / 100

Method: Lighthouse CI (treosh/lighthouse-ci-action) against the deployed showcase, on a daily schedule; committed snapshot read from main.
As of 2026-09-01

Performance snapshot
Live

89 / 100

Method: Lighthouse CI (treosh/lighthouse-ci-action) against the deployed showcase, on a daily schedule; committed snapshot read from main.
As of 2026-09-01

06 /Versions

Shipped packages and apps

Packages
13
in packages/*
Apps
10
in apps/*
@asafarim/adminv0.1.0
@asafarim/appbuilderv0.4.0
@asafarim/appbuilder-aiv0.1.0
@asafarim/appbuilder-runtimev0.1.0
@asafarim/appbuilder-schemav0.1.0
@asafarim/authv0.2.0
@asafarim/configv0.1.0
@asafarim/country-language-selectorv0.2.0
@asafarim/dbv0.4.0
@asafarim/hubv0.1.0
@asafarim/labsv0.1.0
@asafarim/seed-managerv0.1.0
@asafarim/shared-i18nv0.2.0
@asafarim/showcasev0.1.0
@asafarim/storagev0.1.0
@asafarim/theme-togglev0.1.0
@asafarim/uiv0.2.0
@asafarim/vionto-schemasv0.1.0
@asafarim/webv0.1.0
edumatchv0.3.0
testorav1.0.0
timelineaiv0.1.0
viontov0.4.2
07 /Changelog

Recently shipped