Quorium is a runtime governance system for enterprise frontend composition. It unifies permission filtering, route generation, navigation, runtime rebuild, and plugin capability boundaries into one coherent platform — built on Vue 3 + Quasar.
It prevents permission drift, route sprawl, and store chaos in large-scale Vue applications.
Quorium combines Quorum — the minimum agreement needed to act — and Core.
A quorum-based runtime that determines what is allowed to exist in a frontend system — based on rules, permissions, and capabilities.
export const ProjectsPlugin: QuoriumPlugin = { manifest: { id: 'projects', version: '1.0.0' }, routes: projectsRouteSpecs, install({ app }) { app.provide(PROJECTS_SERVICE_TOKEN, new ProjectsService()); }, isEnabled(flags) { return flags.has('module.projects'); } };
Large frontend applications eventually collapse into chaos. Quorium introduces runtime composition — your app decides at runtime what is allowed to exist.
RouteSpec per module
Designed to mirror the discipline of backend frameworks like NestJS — on the client side.
Routes are generated dynamically based on user permissions. No more hiding menu items while routes remain manually accessible.
Install a feature. Enable it via backend flag. Quorium composes it into the runtime automatically without redeploying.
Routes define navigation. Navigation reflects permissions. Absolutely no duplicated menu configuration.
Login. Logout. Role update. Quorium intercepts session mutations and rebuilds your entire runtime safely and instantly.
No circular imports. No peer-module chaos. Cross-module capabilities are strictly injected via typed DI tokens.
Modules can be enabled or disabled per tenant, per edition, or per organization entirely at runtime.
Quorium sits above the UI layer and intercepts module installation, routing, and capabilities — composing your application purely at runtime.
Quorium treats the frontend like a governed system, not a pile of components. It enforces:
Quorium is not just a pattern. It’s a step toward treating frontend systems as governed platforms. Where features are not hardcoded — they are admitted by quorum.
8 parts — from philosophy to remote plugin loading. One coherent system.
Separation of concerns, naming conventions, dependency flow, and cross-module communication patterns.
Typed DI tokens, event bus, session service, auth guard, module manager, navigation, and the governance flow diagram.
Complete Projects module: routes, client, service, store, policy, and DTOs — the full pattern in practice.
Quasar boot file, module registry, feature flag loading, session event wiring, and defense-in-depth guards.
QuoriumPlugin contract, manifest schema, RuntimeCtx, requires/provides capability model, and lifecycle phases.
JSON Schema, Zod runtime validation, manifest validator, and the quorium-cli scaffold generator concept.
Loading flow, signed manifests, domain allowlist, and trust levels: Core / Verified / Community.
Layer responsibility table, full capabilities matrix, and Quorium as a frontend runtime platform.
From a fresh Quasar project to a governed runtime platform in 5 steps.
Set your database connection and target tables in
generator.config.ts.
tables: [
{ table: 'users', global: true },
{ table: 'projects', global: false },
]
Generates the full Quorium module structure — client, service, store, routes, pages, policy, DTOs — from your DB schema.
npm run generate
# Outputs: template-frontend-q/src/modules/{table}/
# template-frontend-q/src/core/
# template-frontend-q/src/boot/modules.ts
src/modules/index.ts
is the single registry. Generated automatically — just
import and ship.
import { ProjectsModule } from './projects/projects.module';
import { UsersModule } from './users/users.module';
export const modules = [ProjectsModule, UsersModule];
Add
src/boot/modules.ts
to your Quasar config. This single file wires the entire
governance runtime.
// quasar.config.ts boot: ['modules']
Consume permission-filtered navigation directly. No menu config file needed — ever.
// MainLayout.vue
const navItems = computed(() =>
buildNavigation(modules, {
permissions: new Set(session.getPermissions()),
enabledModules: new Set(flags.enabledModules),
})
);