Skip to content

Platform overview

Monark is a business-application platform: one TypeScript codebase that gives an organization identity, permissions, its own databases, automations and communications, with end-user apps such as Kanban and Wiki on top. The idea that makes the rest make sense: a small core supplies every shared capability, and extended modules add business features by registering with core at boot, never by changing it.

One deployment, one organization

Monark is single-tenant. A deployment serves exactly one organization. The API creates that organization at first boot from the INITIAL_ORG_* environment variables (or pnpm provision:org creates it on demand), and every user who signs up or signs in joins it automatically. There is no in-app setup wizard and no organization switcher.

To serve several businesses, run several independent instances, each with its own database, domain and branding. The same API image runs every instance; only its environment differs. See Serve one organization per deployment for why multi-tenancy was removed.

Core and extended

Every feature lives in its own workspace package, and modules.manifest.ts assigns each one a tier.

  • Core modules ship with every deployment and may depend on each other. Removing one breaks the app.
  • Extended modules are business features. They may depend on core, never on another extended module, so any one of them can be removed without touching the others.

Whether a feature is core or extended is an engineering fact. Readers find Kanban next to Data in these docs, not in a separate "modules" area. The full list is in Modules; how the tiers are enforced is in Architecture.

The map

Core subsystems:

SubsystemWhat it doesRead more
ArchitectureModule tiers, boundaries, the event bus, codegen, boot sequence, the web app shellArchitecture
Users and authenticationAccounts, sign-in, two-factor, trusted devices, organization membershipUsers and authentication
PermissionsRoles, granular permissions, and per-record restrictionsPermissions
Data models and queriesAdmin-defined databases (models, fields, records) and the query language that filters themData models and queries
AutomationsEvent-triggered flows built as node graphs and run by a durable workerAutomations
NotificationsIn-app and email messages, with per-user preferencesNotifications
Identity and integrationWebhooks, API keys, service accounts, and the public REST APIIdentity and integration
SecretsA write-only, encrypted store for the credentials integrations useSecrets
Chat agentThe in-app assistant, which acts through the same routes as the public APIChat agent
Block editorThe block-based document editor shared by wiki pages, cards and document fieldsBlock editor
FilesSigned uploads to private storage, used by file fieldsFiles
Feature flagsRuntime switches resolved per user, role, organization or globallyFeature flags
Global searchOne command palette that searches every module that registers a sourceThe extensibility contract
BrandingThe app name, colours, logo and sender address, set per deploymentRebrand an instance

Extended modules:

ModuleWhat it doesRead more
KanbanBoards, columns and cardsUse Monark
CalendarCalendars, events, reminders, and events generated from data modelsUse Monark
WikiA tree of nested pagesUse Monark
AchievementsBadges awarded automatically when events happenAchievements
GitHub, Telegram, Discord, X (Twitter)Connect a third-party service to automationsIntegration modules

The pieces that run

Two thin services compose the modules into a running app, and neither holds business logic:

  • services/web is the Next.js frontend. It imports each module's client and contract code.
  • services/api is the Express and tRPC backend. It imports each module's server and contract code, registers every module at boot, starts the background workers, and serves the public REST API under /api/v1.

PostgreSQL holds the data and Supabase provides sign-in sessions and file storage. The full list of technologies is in Tech stack.

Limits

  • One organization per deployment. Serving another business means another instance.
  • The event bus is in memory; an event is durable only once a webhook or automation outbox has recorded it. See The event bus.
  • Feature-flag overrides have no admin screen; they are set through the API or, in development, with pnpm enable:dev-flags.

Related