Prefer writing code over clicking canvas? NativeBPM lets you define workflows in Go, TypeScript, Python, or Dart/Flutter. The engine automatically compiles your code to standard BPMN 2.0 for visual tracking and durable execution. Предпочитаете писать код, а не рисовать на холсте? NativeBPM позволяет описывать процессы на Go, TypeScript, Python или Dart/Flutter. Движок автоматически скомпилирует ваш код в стандартный формат BPMN 2.0 для визуального мониторинга и надежного выполнения.
1 package main23 import (4 "context"5 "gitlab.com/nativebpm/sdk/go"6 )78 func main() {9 ctx := context.Background()1011 // 1. Build workflow dynamically using Fluent API12 workflow := nativebpm.NewWorkflow("native-demo", "Workflow as Code")13 workflow.14 When(nativebpm.V("isUrgent").Eq(true)).15 Then(func(b *nativebpm.Branch) {16 b.User("reviewOrder", "Review Order Details", nativebpm.M{"assignee": "sales_representative"})17 }).18 Else(func(b *nativebpm.Branch) {19 b.Service("notifyCustomer", "Send Confirmation Email", "email_topic")20 })2122 // 2. Deploy workflow directly via JSON AST (compiled server-side)23 client, _ := nativebpm.NewClient("http://localhost:8080", "token")24 definition, _ := client.Deploy(ctx, workflow)2526 // 3. Start instance27 client.Instances().Start(definition.Id).28 WithBusinessKey("order-5541").29 WithVariable("isUrgent", true).30 Send(ctx)31 }
1 import { Client, Workflow, v } from '@nativebpm/sdk';23 // 1. Build workflow dynamically using Fluent API4 const workflow = new Workflow('native-demo', 'Workflow as Code');5 workflow6 .when(v('isUrgent').eq(true))7 .then(b => {8 b.user('reviewOrder', 'Review Order Details', { assignee: 'sales_representative' });9 })10 .else(b => {11 b.service('notifyCustomer', 'Send Confirmation Email', 'email_topic');12 });1314 // 2. Deploy process definition directly via JSON AST15 const client = new Client('http://localhost:8080', 'token');16 const definition = await client.deploy(workflow);1718 // 3. Start instance19 const instance = await client.instances().start(definition.id)20 .withBusinessKey('order-5541')21 .withVariable('isUrgent', true)22 .send();
1 from nativebpm import Client, Workflow, v23 # 1. Build workflow dynamically using Fluent API4 workflow = Workflow('native-demo', 'Workflow as Code')5 workflow\6 .when(v('isUrgent').eq(True)).then(lambda b: (7 b.user('reviewOrder', 'Review Order Details', {'assignee': 'sales_representative'})8 )).Else(lambda b: (9 b.service('notifyCustomer', 'Send Confirmation Email', 'email_topic')10 ))1112 # 2. Deploy process definition directly via JSON AST13 client = Client('http://localhost:8080', 'token')14 definition = client.deploy(workflow)1516 # 3. Start instance17 instance = client.instances().start(definition.id)\18 .with_business_key('order-5541')\19 .with_variable('isUrgent', True)\20 .send()
1 import 'package:nativebpm_client/nativebpm_client.dart';23 void main() async {4 // 1. Build workflow dynamically using Fluent API5 final workflow = Workflow('native-demo', 'Workflow as Code');6 workflow7 .when(V('isUrgent').eq(true))8 .then((flow) {9 flow.user('reviewOrder', 'Review Order Details', {'assignee': 'sales_representative'});10 })11 .Else((flow) {12 flow.service('notifyCustomer', 'Send Confirmation Email', 'email_topic');13 });1415 // 2. Deploy process definition directly via JSON AST16 final client = Client('http://localhost:8080', 'token');17 final definition = await client.deploy(workflow);1819 // 3. Start instance20 final instance = await client.instances().start(definition.id)21 .withBusinessKey('order-5541')22 .withVariable('isUrgent', true)23 .send();24 }
1 import com.nativebpm.client.Client;2 import com.nativebpm.client.model.StartInstanceRequest;3 import com.nativebpm.client.builder.Workflow;4 import static com.nativebpm.client.builder.Workflow.V;5 import java.util.Map;67 public class Main {8 public static void main(String[] args) throws Exception {9 // 1. Build workflow dynamically using Fluent API10 Workflow workflow = new Workflow("native-demo", "Workflow as Code");11 workflow12 .when(V("isUrgent").eq(true)).then(b -> {13 b.user("reviewOrder", "Review Order Details", Map.of("assignee", "sales_representative"));14 }).Else(b -> {15 b.service("notifyCustomer", "Send Confirmation Email", "email_topic");16 });1718 // 2. Deploy process definition directly via JSON AST19 Client client = new Client("http://localhost:8080", "token");20 var definition = client.deploy(workflow);2122 // 3. Start instance23 StartInstanceRequest request = new StartInstanceRequest();24 request.setBusinessKey("order-5541");25 request.putVariablesItem("isUrgent", true);26 client.getDefaultApi().startInstance(definition.getId(), request);27 }28 }
1 using NativeBPM.Client.Api;2 using NativeBPM.Client.Client;3 using NativeBPM.Client.Model;4 using NativeBPM.Client.Builder;5 using static NativeBPM.Client.Builder.Workflow;6 using System.Collections.Generic;78 // 1. Build workflow dynamically using Fluent API9 using var workflow = new Workflow("native-demo", "Workflow as Code");10 workflow11 .When(V("isUrgent").Eq(true)).Then(b => {12 b.User("reviewOrder", "Review Order Details", new Dictionary<string, object> {13 { "assignee", "sales_representative" }14 });15 }).Else(b => {16 b.Service("notifyCustomer", "Send Confirmation Email", "email_topic");17 });1819 // 2. Deploy process definition directly via JSON AST20 var client = new HttpClient { BaseAddress = new Uri("http://localhost:8080") };21 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "token");22 var api = new DefaultApi(client);23 var definition = await api.DeployWorkflowAsync(workflow);2425 // 3. Start instance26 var request = new StartInstanceRequest(27 businessKey: "order-5541",28 variables: new Dictionary<string, object> { { "isUrgent", true } }29 );30 await api.StartInstanceAsync(definition.Id, request);
1 use NativeBPM\Client\Builder\Workflow;2 use NativeBPM\Client\Configuration;3 use NativeBPM\Client\Api\DefaultApi;45 // 1. Build workflow dynamically using Fluent API6 $workflow = new Workflow("native-demo", "Workflow as Code");7 $workflow8 ->when(Workflow::V('isUrgent')->eq(true))->then(function($b) {9 $b->user("reviewOrder", "Review Order Details", ["assignee" => "sales_representative"]);10 })->else(function($b) {11 $b->service("notifyCustomer", "Send Confirmation Email", "email_topic");12 });1314 // 2. Deploy process definition directly via JSON AST15 $config = Configuration::getDefaultConfiguration()16 ->setHost('http://localhost:8080')17 ->setApiKey('Authorization', 'Bearer token');18 $api = new DefaultApi(null, $config);19 $definition = $api->deployWorkflow($workflow);2021 // 3. Start instance22 $request = new \NativeBPM\Client\Model\StartInstanceRequest([23 'business_key' => 'order-5541',24 'variables' => ['isUrgent' => true]25 ]);26 $api->startInstance($definition->getId(), $request);
1 use nativebpm_client::{Workflow, v};2 use nativebpm_client::apis::{configuration, default_api};3 use nativebpm_client::models::StartInstanceRequest;45 // 1. Build workflow dynamically using Fluent API6 let mut workflow = Workflow::new("native-demo", "Workflow as Code");7 workflow8 .when(v("isUrgent").eq(true)).then(|b| {9 b.user("reviewOrder", "Review Order Details", serde_json::json!({ "assignee": "sales_representative" }));10 }).Else(|b| {11 b.service("notifyCustomer", "Send Confirmation Email", "email_topic", serde_json::json!({}));12 });1314 // 2. Deploy process definition directly via JSON AST15 let mut config = configuration::Configuration::new();16 config.base_path = "http://localhost:8080".to_string();17 config.bearer_access_token = Some("token".to_string());18 let definition = default_api::deploy_workflow(&config, &workflow).await?;1920 // 3. Start instance21 let mut variables = std::collections::HashMap::new();22 variables.insert("isUrgent".to_string(), serde_json::json!(true));23 let request = StartInstanceRequest {24 instance_id: None,25 business_key: Some("order-5541".to_string()),26 variables: Some(variables),27 };28 default_api::start_instance(&config, &definition.id, Some(request)).await?;
1 import com.nativebpm.client.Client2 import com.nativebpm.client.builder.Workflow3 import com.nativebpm.client.builder.Workflow.V45 fun main() {6 // 1. Build workflow dynamically using Fluent API7 val workflow = Workflow("native-demo", "Workflow as Code")8 workflow9 .when(V("isUrgent").eq(true)).then { b ->10 b.user("reviewOrder", "Review Order Details", mapOf("assignee" to "sales_representative"))11 }12 .Else { b ->13 b.service("notifyCustomer", "Send Confirmation Email", "email_topic")14 }1516 // 2. Deploy process definition directly via JSON AST17 val client = Client("http://localhost:8080", "token")18 val definition = client.deploy(workflow)1920 // 3. Start instance, passing 'isUrgent' variable to initialize it21 client.instances().start(definition.id)22 .withBusinessKey("order-5541")23 .withVariable("isUrgent", true)24 .send()25 }
1 import NativeBPMClient2 import AnyCodable34 func runWorkflow() async throws {5 let client = Client(baseURL: "http://localhost:8080", apiToken: "token")67 // 1. Build workflow dynamically using Fluent API8 let workflow = Workflow(id: "native-demo", name: "Workflow as Code")9 workflow10 .when(V("isUrgent").eq(true)).then { b in11 b.user("reviewOrder", name: "Review Order Details", options: ["assignee": "sales_representative"])12 }.else { b in13 b.service("notifyCustomer", name: "Send Confirmation Email", topic: "email_topic")14 }1516 // 2. Deploy definition using Workflow object directly (JSON AST compiled server-side)17 let definition = try await client.deploy(workflow)1819 // 3. Start process instance20 let instance = try await client.instances().start(definition.id)21 .withBusinessKey("order-5541")22 .withVariable("isUrgent", AnyCodable(true))23 .send()24 }
⚡ Mix-and-Match
Orchestrate a pipeline that mixes services written in Rust with human approval forms defined using the Go or TypeScript workflow builders.
⚙ Language Independence
Task logic compiles to target independent WebAssembly snapshots. Deploy seamlessly across GCP Cloud Run, AWS Lambda, or on-premise.
◈ Dual-Execution
Toggle between zero-trust, securely sandboxed WebAssembly execution and high-performance native in-process handler bindings.
Install via Package Managers:
v1.1.0 (Latest Release)go get gitlab.com/nativebpm/sdk/go
npm install @nativebpm/sdk
pip install nativebpm
nativebpm_client: { git: { url: "https://gitlab.com/nativebpm/sdk.git", path: "dart" } }
implementation("com.nativebpm:client:1.1.0")
.package(url: "github.com/nativebpm/sdk")
cargo add nativebpm
dotnet add package NativeBPM.Client
com.nativebpm:nativebpm-client
GitLab Package & Container Registries:
# Configure scope registry
npm config set @nativebpm:registry https://gitlab.com/api/v4/projects/nativebpm%2Fsdk/packages/npm/
npm install @nativebpm/sdk
pip install nativebpm-client --extra-index-url https://gitlab.com/api/v4/projects/nativebpm%2Fsdk/packages/pypi/simple
docker pull registry.gitlab.com/nativebpm/platform:latest
Architected from the ground up to solve index contention, multi-tenancy isolation, and slow Guest execution. Спроектирован с нуля для решения проблем конкуренции индексов, изоляции арендаторов и медленного выполнения гостевых процессов.
Say goodbye to legacy execution bottlenecks. NativeBPM compiles and runs business workflows directly in-memory, achieving speeds of over 12,000 requests per second with strict thread safety and microsecond latencies. Забудьте об устаревших узких местах производительности. NativeBPM компилирует и запускает бизнес-процессы прямо в оперативной памяти, достигая скорости более 12 000 запросов в секунду со строгой потокобезопасностью и микросекундными задержками.
Ditch database polling loops. NativeBPM routes all state transactions and queue actions through a polymorphic transactional outbox, distributing events over Postgres, Memory, or Sequin HTTP Pull. Откажитесь от циклов опроса базы данных. NativeBPM направляет все транзакции состояния и действия очереди через полиморфный транзакционный Outbox, распределяя события через Postgres, оперативную память или Sequin HTTP Pull.
Zero-trust, secure, and standalone. Cryptographic role-based access control (RBAC), age file encryption, and mandatory multi-factor authentication (TOTP) built directly into the engine binary. Standalone-безопасность с нулевым доверием (zero-trust). Криптографический ролевой доступ (RBAC), шифрование файлов age и обязательная двухфакторная аутентификация (TOTP), встроенные прямо в бинарный файл движка.
BPMN Service tasks acted as LLM tools. Wire LLM agents directly to trigger engine tasks with type-safe parameters, structured JSON schema outputs, and full audit logs tracing prompts and tokens. Сервисные задачи BPMN работают как инструменты для LLM. Подключайте LLM-агентов напрямую для запуска задач движка с типобезопасными параметрами, структурированными JSON-схемами на выходе и полным аудитом промптов и токенов.
Temporal-like retries with customizable backoff strategies, automated error capture, and a visual Incident Manager allowing admins to patch variables and resolve incidents on-the-fly. Повторы в стиле Temporal с настраиваемыми стратегиями задержки, автоматическим перехватом ошибок и визуальным диспетчером инцидентов, позволяющим администраторам исправлять переменные и решать инциденты на лету.
Scale to billions of rows. Process instance records are hash-partitioned across DB tables. Logs are written to an append-only transaction CDC stream, preventing indexes from locking under load. Масштабирование до миллиардов строк. Записи экземпляров процессов хэш-партиционированы по таблицам БД. Журналы записываются в CDC-поток транзакций (append-only), что исключает блокировку индексов под нагрузкой.
NativeBPM is fully compliant with official ISO/IEC 19510 standards. You can design, model, and export your processes using Camunda Modeler, Cawemo, Enterprise Architect, or any other BPMN 2.0-compliant tool. Just drop the XML schema into NativeBPM and run it instantly without modifications. NativeBPM полностью соответствует официальным стандартам ISO/IEC 19510. Вы можете проектировать, моделировать и экспортировать свои процессы с помощью Camunda Modeler, Cawemo, Enterprise Architect или любого другого инструмента, совместимого с BPMN 2.0. Просто загрузите XML-схему в NativeBPM и запустите её без изменений.
Deploy NativeBPM side-by-side with Supabase. Authenticate users via Supabase Auth (GoTrue REST/JWT), run logical replication webhooks, and embed the NativeBPM Dashboard directly within the Next.js Supabase Studio dashboard. Развертывайте NativeBPM бок о бок с Supabase. Аутентифицируйте пользователей через Supabase Auth (GoTrue REST/JWT), запускайте вебхуки логической репликации и встраивайте дашборд NativeBPM непосредственно в дашборд Next.js Supabase Studio.
Build high-load pipelines by processing process activity logs asynchronously. Sequin captures events from the partitioned engine tables via PostgreSQL WAL, streaming them into HTTP Pull consumers for zero-loss message processing. Стройте высоконагруженные конвейеры обработки логов активности процессов в асинхронном режиме. Sequin захватывает события из секционированных таблиц движка через PostgreSQL WAL, передавая их в потребители HTTP Pull для обработки сообщений без потерь.
Process PDFs and compile emails directly inside the execution engine. Run the Rust-based MJML parser locally to output structured responsive templates, and call Gotenberg API tasks for parallel, isolated PDF rendering. Обрабатывайте PDF и компилируйте электронные письма непосредственно в движке выполнения. Запускайте парсер MJML на базе Rust локально для создания адаптивных шаблонов и вызывайте задачи API Gotenberg для параллельного изолированного рендеринга PDF.
Integrate Google GenAI SDK and OpenAI APIs into your workflow graphs. Define BPMN Service Tasks as LLM tools, allowing AI agents to dynamically execute engine-orchestrated tasks, validate JSON schemas, and log prompts. Интегрируйте Google GenAI SDK и API OpenAI в графы ваших процессов. Определяйте сервисные задачи BPMN как инструменты LLM, позволяя ИИ-агентам динамически выполнять оркестрованные задачи, валидировать схемы JSON и логировать промпты.
Orchestrate microservices durable execution patterns. Use Restate event-sourced workers or Temporal execution workflows side-by-side with NativeBPM, replacing resource-heavy DB states with lightweight in-memory execution snapshots. Оркестрируйте шаблоны надежного выполнения микросервисов. Используйте событийно-ориентированные воркеры Restate или рабочие процессы Temporal бок о бок с NativeBPM, заменяя тяжелые состояния БД легковесными снимками в оперативной памяти.
Host all services on the nativebpm.com domain via a Global L7 HTTPS Load Balancer. Secure private DB access over Serverless VPC Connector to Cloud SQL, and persist snapshots to Cloud Storage buckets. Размещайте все сервисы на домене nativebpm.com с помощью глобального балансировщика HTTPS L7. Обеспечьте безопасный доступ к приватной БД через Serverless VPC Connector к Cloud SQL и сохраняйте снимки в корзины Cloud Storage.
Visual Workflows.
Визуальные процессы.
A modern, developer-first BPMN 2.0 execution engine. Run ultra-fast visual workflows, isolate tenants instantly, and scale to billions of transactions with maximum hardware efficiency and zero database overhead. Современный, созданный для разработчиков движок выполнения BPMN 2.0. Запускайте сверхбыстрые визуальные процессы, мгновенно изолируйте тенанты и масштабируйтесь до миллиардов транзакций с максимальной аппаратной эффективностью и нулевыми издержками БД.