/ 02 — SONDA · EVERY CAPABILITY
1,610 capabilities. Each one checked against the code that ships.
Not a roadmap. Every line below is in the build that ships, and every one of them is in the free edition. 53 areas; use the index to jump.
1,610Capabilities
74Protocols
53Areas
20Seats free, forever
0Accounts at LockFlare
0Bytes stored by us
The index
Every area, with its count.
Protocols · 74
| HTTP / REST | GraphQL |
| GraphQL schema / introspection | gRPC |
| gRPC unary | gRPC server streaming |
| gRPC client streaming | gRPC bidirectional streaming |
| Interactive persistent gRPC streaming session | Keep gRPC stream open between messages |
| Send messages individually into an open gRPC stream | Receive gRPC messages individually as they arrive |
| Half-close client sending side | Continue receiving after client half-close |
| Explicit live-stream cancellation | Live sent / received gRPC event log |
| Expand individual live-stream messages | Live sent / received counters |
| gRPC response headers on live stream | gRPC trailers on live stream |
| Final gRPC status / code / message | Per-stream event sequence / history |
| Tree connection badge while gRPC stream is open | Close active gRPC stream from tree context menu |
| Batch execution remains available beside live streaming | Invalid outgoing message is rejected without closing stream |
| Open gRPC streams close on Workspace / account switch | gRPC reflection |
| .proto loading | WebSocket |
| Saved WebSocket messages | Native Socket.IO client |
| Socket.IO namespaces | Socket.IO auth payload |
| Socket.IO event ACKs | Socket.IO ACK round-trip timing |
| Socket.IO binary events | Socket.IO binary ACKs |
| SSE / Event Streams | SSE automatic reconnect |
| SSE Last-Event-ID | SSE retry semantics |
| MQTT | MQTT 3.1.1 |
| MQTT 5 | MQTT QoS 0 / 1 / 2 |
| MQTT retained messages | MQTT wildcard subscriptions |
| MQTT 5 properties | MQTT response-topic handling |
| MQTT correlation data | MQTT client certificates over mqtts:// and wss:// |
| STOMP over WebSocket | STOMP 1.2 |
| STOMP 1.1 / 1.0 negotiation | STOMP CONNECT / CONNECTED |
| STOMP SUBSCRIBE / UNSUBSCRIBE | STOMP SEND / MESSAGE |
| STOMP ACK / NACK | STOMP auto / client / client-individual ack modes |
| STOMP RECEIPT handling | STOMP receipt round-trip timing |
| STOMP heartbeat negotiation | STOMP automatic heartbeat |
| Persistent STOMP subscriptions | Automatic STOMP resubscribe |
| STOMP ERROR frame interpretation | The transport chosen per gRPC call: native gRPC over HTTP/2, gRPC-Web or Connect |
| gRPC-Web through a gateway: unary and server-streaming calls, the status read from the trailer frame | The Connect protocol: unary and server-streaming calls, errors as JSON read into the answer |
| A pasted URL read as a gRPC target: the scheme says TLS, the path dropped | What came instead of gRPC said in words: a page, a 404, a server that speaks native only |
| MQTT reconnects on its own, its subscriptions made again | An MQTT unsubscribe the broker did not take is owed, and paid on the next connect |
Kafka · 21
| Kafka cluster connections from the bootstrap servers | Pure-Go Kafka client, no native libraries |
| TLS with your own certificate authorities | Self-signed lab clusters on request |
| Client certificates (mutual TLS) for every broker | SASL PLAIN |
| SASL SCRAM-SHA-256 and SCRAM-SHA-512 | Topic list with partitions, leaders and in-sync replicas |
| Log start and end offsets per partition | Internal topics behind a toggle |
| Read a topic, one partition or every partition | Read from the end, the start, an offset or a point in time |
| Relative-time reads (for example, 15 minutes ago) | Reads join no consumer group and commit no offsets |
| Kept reads restart on every connect | Record stream with topic, partition, offset, key, value, headers and timestamp |
| JSON pretty-print and base64 for binary values | Produce records with a key, a value and headers |
| Produce by key or to a chosen partition | Every listener keeps its own watermark: history is never a trigger |
| A listener’s read grows with the topic: new partitions taken on |
RabbitMQ · 24
| RabbitMQ brokers over AMQP 0-9-1 | amqp:// and amqps:// with your own certificate authorities |
| Self-signed brokers on request | Client certificates (mutual TLS) |
| Connection named Sonda in the broker’s own UI | Consume with automatic acknowledgement |
| Acknowledge once the message is on screen | Hold mode: see messages without taking them |
| Prefetch limit per consume | Reject or dead-letter consumed messages |
| Get one message: peek and put back, or take | Publish to an exchange with a routing key |
| Every AMQP message property and custom headers | Publisher confirms on every publish |
| Mandatory publishing with the broker’s return reason | Stream tags: redelivered, returned, held, peeked, rejected, dead-lettered |
| Dead-letter reason and x-death count | Queues, exchanges and bindings listed with their counts |
| Queue inspection | Declare queues and exchanges |
| Bind and unbind queues | Purge a queue |
| Delete queues and exchanges | JSON pretty-print and base64 for binary bodies |
NATS · 36
| NATS servers and clusters, one address or several | nats://, tls://, ws:// and wss:// |
| TLS with your own certificate authorities | Client certificates (mutual TLS) |
| Self-signed servers on request | User and password, or a token |
| NKey seed or a .creds file | Connection name of your choice, Sonda by default |
| Custom inbox prefix for restricted accounts | JetStream domains for leaf nodes |
| Server name, version and cluster shown on connect | JetStream detected on connect, with the reason when it is missing |
| Automatic reconnect | Subscribe with * and > wildcards |
| Queue groups | Kept subscriptions and stream reads restart on every connect |
| Publish with headers and a reply subject | Request–reply: the first answer and how long it took |
| No responders reported when nobody listens | JetStream publish with the stream’s acknowledgement |
| Nats-Msg-Id for duplicate detection | Streams listed with what each one holds |
| Consumers listed with where each one is | Read a stream from new, all, the last, a sequence or a point in time |
| The last message of every subject | Relative-time reads (for example, 15 minutes ago) |
| Stream reads filtered by subject, wildcards allowed | Reads through ephemeral ordered consumers: no durable consumer moves |
| Get one stored message by sequence, or the last of a subject | Key/Value buckets listed |
| Keys listed, with * and > filters | A key’s value and its whole history |
| Put a value and see its revision | Delete a key with its history kept, or purge it |
| Watch a bucket or a key pattern live | JSON pretty-print and base64 for binary data |
AMQP 1.0 · 32
| AMQP 1.0 brokers: Azure Service Bus and Event Hubs, ActiveMQ Artemis and Classic, Qpid, Solace, IBM MQ, RabbitMQ 4 | amqp:// and amqps:// with your own certificate authorities |
| AMQP over WebSockets (wss://) for brokers behind a firewall | Azure Service Bus and Event Hubs connection strings |
| Client certificates (mutual TLS) | Self-signed brokers on request |
| SASL PLAIN, EXTERNAL and ANONYMOUS | Virtual host of your choice |
| Connection named Sonda in the broker’s own list, or a name of your choice | Idle timeout of your choice |
| Broker product and version shown on connect | The reason shown when the broker closes the connection |
| Hold mode: see messages without taking them | Accept, put back or dead-letter each held message |
| Held messages go back to the broker when a receive stops | Receive and accept |
| Browse: copies, the messages stay where they are | Receive and reject to the dead-letter queue |
| Link credit and a stop-after count per receive | JMS selector filters |
| Event Hubs partition start positions | Azure Service Bus sessions: one by its ID, or the next one free |
| Kept receives restart on every connect | Send with the broker’s outcome: accepted, rejected with its reason, released or modified |
| Request–reply on a temporary address, with how long it took | Body sent as bytes or as an AMQP string (JMS TextMessage) |
| Message ID, correlation ID, subject, reply-to and group ID | Durable, priority and time to live |
| Typed application properties and message annotations | Properties, application properties and annotations shown with their types |
| Data, value and sequence bodies read | JSON pretty-print and base64 for binary bodies |
Redis · 31
| Redis streams and Pub/Sub, standalone or cluster | Clusters from several nodes or one configuration endpoint |
| rediss:// with your own certificate authorities | Client certificates (mutual TLS) |
| Self-signed servers on request | ACL users |
| Database selection | Client name of your choice in CLIENT LIST, Sonda by default |
| Server version and mode shown on connect | Stream keys found by pattern, on every master of a cluster |
| Each stream’s length, groups, first and last entries | Consumer groups with consumers, pending entries and lag |
| Pending entries with the consumer, idle time and delivery count | Read a stream live from new, the start, an ID or a point in time |
| Relative-time reads (for example, 15 minutes ago) | Read as one of a group’s consumers (XREADGROUP) |
| New entries for the group, or the consumer’s own pending | Acknowledge on read, or leave pending until Ack |
| First or last hundred entries (XRANGE, XREVRANGE) | Add entries (XADD) with field-value pairs |
| Entry IDs of your own, or made by Redis | Trim on add (MAXLEN ~) |
| Delete entries one by one | Create consumer groups from the end, the start or an ID |
| Create the stream with its first group | Remove consumer groups |
| Consumers Sonda made leave the group when the read ends, unless they hold entries | Pub/Sub: subscribe to channels and patterns |
| Publish and see how many subscribers got it | Kept reads and subscriptions restart on every connect |
| JSON pretty-print and base64 for binary values |
FIX · 43
| FIX sessions, Sonda as the initiator | FIX 4.0 to 4.4 |
| FIXT 1.1 for FIX 5.0, SP1 and SP2 | TCP, or TLS with your own certificate authorities |
| Client certificates (mutual TLS) | Self-signed counterparties on request |
| SenderCompID, TargetCompID and the optional SubIDs | Username and password on the Logon |
| Extra Logon fields of your own | Heartbeat interval of your choice |
| Sequence numbers reset on every logon, or carried on | Next sequence numbers shown, and set by hand between sessions |
| Heartbeats sent when the session is quiet | A test request when the counterparty goes quiet |
| The counterparty’s test requests answered | Test request on demand, with how long the answer took |
| Resend requests answered: messages sent again as possible duplicates, with their original sending time | The session’s own messages skipped with a gap fill |
| Gaps in the counterparty’s numbers asked for again | The counterparty’s sequence resets followed |
| A sequence number lower than expected: logged out as FIX asks, with the reason | Logout said both ways |
| Body length and checksum checked on every message; a garbled one is reported and dropped | Messages written as tags and values, in their order |
| Tags by number or by name | Repeating groups as written |
| Fields as rows, or as text, one tag=value a line | Times, dates and fresh IDs filled in when sent |
| The session’s own fields written by Sonda | Values offered from each field’s own list, with their meanings |
| Templates: new order, cancel, replace, order status, market data, quote request, security list, mass status | Cancel, replace and status requests start from the last order sent |
| Paste a message (SOH, | or ^A) into the composer | Wait for the answer, matched by a shared tag such as ClOrdID or MDReqID |
| Reject and BusinessMessageReject counted as the answer | Every field logged with its name and the meaning of its value |
| FIX 4.0 to 5.0 SP2 dictionary built in, nothing fetched | Possible duplicates marked in the log |
| Heartbeats and test requests behind a toggle | Filter the log, or by a message’s ClOrdID or symbol |
| Send a logged message again | Cancel a logged order, filled in from it |
| Copy a message, with or without SOH, or its fields as JSON |
HL7 v2 / MLLP · 35
| HL7 v2 over MLLP, both ways: send and listen | HL7 versions 2.1 to 2.8.2 |
| Interface engines, EHRs and lab systems | TLS with your own certificate authorities |
| Client certificates (mutual TLS) | One connection, many messages |
| Empty MSH-7 and MSH-10 filled when sent: the time and a control ID | MSH-3 to MSH-6, MSH-11 and MSH-12 from the session |
| Now in any date or time field becomes the moment it is sent | Wait for the ACK that carries the message’s control ID (MSA-2) |
| AA, AE and AR read into words, with how long the ACK took | Enhanced mode: CA, CE and CR |
| Templates: admit, register, update patient, discharge, order, result, appointment, vaccination, document | Listen on a port, 2575 by default, this computer only or the network too |
| Answer each message: accept, error, reject or nothing | AE answers carry an ERR segment (2.5 and later) |
| Enhanced-mode acknowledgments as MSH-15 and MSH-16 ask | The ACK built from the message’s own MSH, reversed |
| One log for sending and listening | Each message by its type and meaning (ADT^A01 · Admit/visit notification) |
| A summary line: patient, MRN, visit, order, results with units and flags | Every segment, field, repetition, component and subcomponent named |
| Coded values read into their meaning (PID-8 F: Female) | OBX-5 read by the type OBX-2 names |
| HL7 escape sequences read | Names from the message’s own version (MSH-12) |
| HL7 syntax coloring in the composer | The composer checks as it is written: a missing or second MSH, an empty MSH-9, a segment the version does not have |
| Z segments accepted | UTF-8 or ISO-8859-1, as MSH-18 says |
| Bytes outside a frame dropped and reported | Copy a message, with CR, or its fields as JSON |
| Send a logged message again or on, with a fresh time and control ID | Filter the log by control ID or patient |
| HL7 steps in flows: the ACK’s code and fields as the output |
STOMP brokers · 28
| STOMP brokers: ActiveMQ Classic and Artemis, RabbitMQ’s STOMP plugin, any STOMP 1.0 to 1.2 broker | STOMP over TCP: stomp://, tcp:// or host:port |
| STOMP over TLS: stomp+ssl://, stomps://, ssl:// or tls:// | STOMP over WebSocket: ws:// and wss://, with the STOMP subprotocols offered |
| TLS with your own certificate authorities | Client certificates (mutual TLS) |
| Self-signed lab brokers on request | Virtual host, login and passcode, from variables and secret:// references too |
| Extra CONNECT headers, such as client-id for durable subscriptions | Heart-beats both ways at the slower rate, a quiet broker detected |
| ERROR frames read into words | Destinations: /queue/, /topic/, RabbitMQ’s /exchange/ and Artemis addresses |
| Ack modes: auto, client, and client one by one | Subscription headers: selectors, prefetch-count, durable names |
| Receipts waited for on SUBSCRIBE, so a refusal says itself | Kept subscriptions made on every connect |
| Held messages acknowledged or nacked from the log | ACK and NACK carry the 1.2, 1.1 and 1.0 headers, for every broker |
| Unsubscribe gives held messages back to the broker | Send JSON or text with its content type, JSON checked before it goes |
| A receipt on every send by default, with how long it took | Sonda’s own protocol headers protected from override |
| Disconnect with a receipt, held messages given back | Each message by destination and message-id, headers and a pretty body on click |
| Base64 for binary bodies | Copy a body or the headers as JSON, send a message again, filter by destination |
| STOMP steps in flows | CR LF frames read (STOMP 1.2) |
MCP · 33
| MCP client | MCP STDIO |
| MCP Streamable HTTP | Legacy MCP HTTP/SSE compatibility |
| MCP Tools | MCP Resources |
| MCP Resource Templates | MCP Prompts |
| MCP generated forms from input schema | MCP completion suggestions |
| MCP progress notifications | MCP elicitation |
| MCP sampling | MCP server logs |
| MCP logging-level control | MCP OAuth discovery |
| MCP PKCE | MCP Dynamic Client Registration |
| MCP result treated as a normal API response | MCP result → Pretty / Raw |
| MCP result → Table | MCP result → XML / YAML |
| MCP result → generated types | MCP result history |
| MCP result diff | Themis can discover connected MCP servers |
| Themis can call MCP tools | Themis can read MCP resources |
| MCP sampling can use configured AI provider | MCP Roots client capability |
| Search tools / resources / prompts | Real-time MCP notifications |
| Explicit stateless / legacy protocol selection |
SOAP & RPC · 24
| SOAP 1.1 | SOAP 1.2 |
| SOAP envelope generation | SOAP Header authoring |
| SOAPAction handling | SOAP Fault interpretation |
| WSDL 1.1 import | WSDL → categorized Project |
| XSD-aware SOAP request skeleton generation | Nested complex-type skeleton generation |
| Repeated / optional XSD element hints | JSON-RPC 2.0 |
| JSON-RPC positional params | JSON-RPC named params |
| JSON-RPC notifications | JSON-RPC auto request IDs |
| JSON-RPC fixed number / string IDs | JSON-RPC error interpretation |
| JSON-RPC batch response counting | XML-RPC |
| XML-RPC typed value serialization | XML-RPC array / struct values |
| XML-RPC dateTime / nil values | XML-RPC fault interpretation |
Industrial: the shared core · 20
| Industrial devices as items of a project: Modbus, OPC UA, HART-IP, DDS | Tags: a name, a type, a scale and an offset, a unit |
| Every value with its quality: good, uncertain or bad | Every value with the time it was read |
| Watching: a value logged only when it changes | Deadbands: a number reported only once it moves past its deadband |
| A device gone quiet is asked less often until it answers | Writing off by default, switched on per device, asked first |
| Writing checked by the backend on the device as the project stores it | Every write on the activity log, with a trigger on it |
| A device’s tags as topics: watchers and flow triggers listen to them | Flows read tags and write them, with May send changes |
| Functions read tags with app.read and write them with app.publish | A log per device: reads, writes and changes |
| App runners reach only the devices their apps use | On watch: every read, or every change, sent to a request of the project |
| The read as one envelope, the same for every device: values, quality, units, what changed | A request with its own body takes the values by name: {{$watch.values.Level}} |
| The API down never stops the watch: failures counted on the tab, said in the device’s log | A slow API gets the latest read, never a queue |
Modbus · 19
| Modbus TCP | Modbus RTU over TCP, through a serial gateway |
| Read coils and discrete inputs | Read holding and input registers |
| Write a coil, a register, or several | Device identification |
| Exceptions in plain words | Types: bool, 16, 32 and 64-bit integers, float32, float64, string |
| Byte and word orders: ABCD, CDAB, BADC, DCBA | Scale and offset, read and written |
| Registers close to each other read in one request | Register map with live values |
| Addresses as manuals write them: 40001 | Raw reads: unsigned, signed, hex and binary |
| A raw register made a tag in one click | Register map pasted from CSV, copied as CSV |
| Unit id, timeout and watch interval per device | A write in the tag’s own units: 21.5 °C, not register 215 |
| A device that closes the connection is connected again, the request sent again |
OPC UA · 17
| OPC UA over opc.tcp | Security policies: None, Basic256Sha256, Aes128-Sha256-RsaOaep, Aes256-Sha256-RsaPss |
| Signed, or signed and encrypted | Logon: anonymous, or a username and a password |
| Ask the server: its policies, modes and logons | The server’s certificate pinned: a first contact asks before connecting |
| A changed server certificate refused | This computer’s own application certificate, copied as PEM for the server’s administrator |
| Browse the address space from the Objects folder down | A variable’s data type and value shown while browsing |
| A node made a tag in one click | Every tag read in one request |
| Quality from the node’s status code | Time from the server’s source timestamp |
| A write in the node’s own data type | The server’s refusals in words |
| Sessions reconnect on their own |
HART-IP · 21
| HART-IP over TCP, port 5094 | An instrument, or a HART-IP gateway or multiplexer in front of it |
| HART 5, 6 and 7 | Found at its polling address, then reached at its unique address |
| PV, SV, TV, QV and the loop current in one command | Percent of range |
| Device variables, each with its own status | Units from the device, as names: bar, °C, m³/h |
| Quality from the field device status | Tag, long tag, descriptor, message and date |
| Write the tag, descriptor and date | Write the long tag and the message |
| Write the damping | Write the range, in its own unit |
| Write protection said before anything is sent | The device’s refusals in its own words |
| Loop test: the current fixed at 4, 12, 20 mA or any value | The loop released when its time is up, on Release, and on disconnect |
| Configuration written only by a person, never by a flow | The session kept alive while open |
| A timed release that fails is tried again every few seconds, said on the activity |
DDS · 32
| DDS in pure Go: RTPS, no C library | Discovery over multicast |
| Discovery by named peers, where multicast does not pass | The network interface chosen per domain |
| Participants, with their vendor and RTPS version | Every topic: its type, its writers, its readers |
| QoS per writer and reader: reliability, durability, history, partitions, representation | Why a reader and a writer do not match, in words |
| ROS 2 topics shown by their ROS names | A topic’s samples live, decoded |
| Types from IDL: modules, structs, enums, typedefs, sequences, arrays, @key | Types from ROS 2 .msg definitions |
| ROS 2’s common types known without a definition | XCDR1 and XCDR2: final, appendable and mutable types |
| A sample with no definition shown as its bytes and its text | Instances told apart by their key |
| Disposed and unregistered instances said | A topic’s field as a tag, for one instance or all |
| Publishing off by default, switched on per domain | Publish a sample written as JSON, encoded by its type |
| Reliable or best effort, volatile or transient local | Late joiners get the samples kept |
| A lost sample resent on the reader’s request | The representation the topic’s readers take, picked on its own |
| Publish to a topic nothing announces yet | A flow writing a tag publishes its instance with the field set |
| Readers matched by DDS’s own rules before the first sample goes | Every sample published on the activity log |
| History kept per instance on a keyed topic | Volatile readers get new samples only; transient-local ones get the history |
| History and resends of any size, split into datagrams | Ownership and partitions matched by DDS’s own rules |
Workspace & scripting · 27
| Workspaces | Multiple accounts / identities |
| Multiple workspaces per account | Environments |
| Parent / child environment inheritance | Variable precedence |
| Dynamic variables | Variable autocomplete |
| Unresolved-variable warnings | Auth inheritance |
| Folder / project inheritance | Pre-request scripts |
| Post-response scripts | JavaScript scripting |
| Go scripting | Python / Starlark scripting |
| A variable set to Ask: no value kept, a form at the send | Asked as text, number, yes / no, or a select with its choices |
| Asked every time, or once | Asked at every request that uses it, or only at the requests picked |
| Only the requests picked, or those and any other while it has no answer | A flow’s run asks too, in its inputs form |
| Route: a variable names the request that fills it, run first when it is empty | Ephemeral variables: never kept, cleared at a change of environment |
| A send reads the variables as their open tab has them, unsaved rows included | What a script sets holds for the session, written nowhere |
| Session values listed under each table, with Keep and Drop |
Runner view · 9
| A request becomes a form for a runner | Each field Hidden, Shown or Runner fills |
| Auth hidden from runners by default | Runner choices inherited from folder and project |
| Instructions for the runner shown above the form | Preview a request as a runner sees it |
| Scripts and checks still run on what a runner sends | Without a Runner view, runners send a scratch copy that is never saved |
| Runners can read and export the documentation |
Collaborative workspaces · 10
| Collaborative Workspaces as a first-class team object | Workspace contains multiple Projects |
| People and roles assigned at Workspace level | New Projects inherit Workspace membership |
| Personal and Collaborative Workspaces coexist | Granted Collaborative Workspaces appear locally automatically |
| New team member lands in first shared Workspace automatically | Workspace membership materialized into Project grants |
| Workspace setup saves name, description and access atomically | Workspace people/role changes publish in one operation |
Cross-division workspace sharing · 11
| Share a Workspace with another Division | Cross-Division access can be Read only |
| Cross-Division access can be Run (send, change nothing) | Cross-Division access can be Read and write |
| Workspace remains physically owned by its home Division | Foreign Division opens the authoritative source Workspace |
| No Project copy is created for cross-Division sharing | Project keys wrapped for authorized members of receiving Division |
| Cross-Division readers/writers added cryptographically | Revoking Division access removes wrapped keys and readers |
| Foreign Workspace visibly identifies its home Division |
Authentication · 13
| OAuth 1.0 (RFC 5849) | OAuth 1.0 HMAC-SHA1 |
| OAuth 1.0 HMAC-SHA256 | OAuth 1.0 PLAINTEXT |
| OAuth 1.0 RSA-SHA1 | OAuth 1.0 Authorization-header signing |
| OAuth 1.0 query-parameter signing | OAuth 1.0 fresh nonce / timestamp per send |
| OAuth 1.0 callback / verifier fields | OAuth 1.0 temporary-credentials request support |
| Postman OAuth 1.0 import / export | Insomnia OAuth 1.0 import / export |
| Postman OAuth 2 / Digest / AWS SigV4 round-trip import-export |
Network · 3
| Cookie jar | Proxy settings |
| Client certificates (mutual TLS) |
Checks & runner · 19
| Code-free assertions / checks | Status assertions |
| Header assertions | Body / path assertions |
| JSON Schema assertions | Draft JSON Schema from response |
| Project → Folder → Request inherited checks | Project / collection runner |
| Choose requests for a run | Multiple iterations |
| CSV datasets | JSON datasets |
| Per-row variables | Delay between requests |
| Stop on failure | Programmatic next-request sequencing |
| HTML runner reports | JUnit reports |
| JSON runner reports |
Load testing · 29
| Built-in load testing | Concurrent virtual users |
| Ramp-up control | Think time |
| Duration-based load test | Request-count-based load test |
| Data-driven load testing | Live RPS |
| Sent / OK / Failed counters | Error rate |
| Min latency | Average latency |
| p50 | p95 |
| p99 | Maximum latency |
| Apdex | Latency histogram |
| Status-code breakdown | Top errors |
| RPS timeline | Latency timeline |
| Per-request load breakdown | Configurable performance pass criteria |
| Saved load-test history | Compare two load-test runs |
| HTML load report | JSON load report |
| Load users distributed across network origins |
Flows · 73
| Flows: a canvas of steps inside a project | Several flows per project |
| Call step: any request in the project | Call step: gRPC calls |
| Call step: MCP tools | Call step: Kafka records |
| Call step: RabbitMQ messages | Call step: MQTT messages |
| Cluster or broker connected before its first call | A request’s variables filled per step |
| A request’s body replaced per step | Flow step: another flow, with its inputs |
| Script step in JavaScript, await included | Set step for named values |
| Note step | If step: a yes and a no branch |
| For each: over a list, a number or words | For each: one at a time or N at once |
| For each: every result collected when done | Join: all, any one, or N of the wires arriving |
| Wait step | Wait until: a call repeated until a condition holds, or a timeout |
| Check step: assertions with pass and fail | End step: success or failure, with a message |
| Show step: a table drawn on the canvas as the flow runs | Several wires from one port run at the same time |
| Any field reaches an earlier step’s answer by name | Upstream outputs listed with their keys, click to copy |
| Flow inputs with a form to run from | Fail ports: a failure handled where it is wired |
| Live run on the canvas: status, words and milliseconds per step | Run history: each step’s outputs, the log, the values set |
| Runs kept per flow, how many is a setting | Runs stay on this computer, never published to the team |
| Credentials hidden in kept runs and exports | Calls in flight capped across branches and loops |
| Time limit for the whole run | Stop on error, or let the rest go on |
| Stop a running flow | Drag a request from the tree onto the canvas |
| Undo and redo | Copy, cut, paste and duplicate steps, between flows too |
| Fit the whole flow into view | Minimap |
| An Echo endpoint can run a flow: a local webhook | The flow answers the webhook with its own status, headers and body |
| Export a run as one HTML page | Runners run a flow from its inputs form, the canvas read-only |
| Themis lists and runs flows | Call step: NATS, AMQP 1.0, Redis, FIX, HL7 and STOMP messages |
| Trigger: a message on one of the project’s messengers starts the flow | Topic wildcards and a filter over the message |
| The message as the flow’s input, its fields filling the inputs | Runs at once set per trigger, in arrival order when one |
| Listening switched on per computer, never on every member’s at once | Changes from a message only with May send changes, asked first |
| A flow that would feed its own topic does not listen | Breaker: 30 runs in 10 seconds switches the trigger off, saying why |
| RabbitMQ, AMQP 1.0 and STOMP: acknowledged after the run, rejected or put back when it fails | HL7: the run answers with AA, AE or AR, and its words |
| RabbitMQ reply-to answered with the run’s reply and correlation id | Call step: Modbus, OPC UA, HART-IP and DDS: read tags, or write one |
| Trigger: a device’s tag changing past its deadband | If, Check, Wait until and filters read by Sonda, never run as code |
| Script step in Sonda’s own engine: the flow’s values, no network | Stopping a trigger ends the messenger’s hold, what waits goes back |
| A queue’s backlog runs the flow from its first message | A read whose scripts send requests counts as a change |
| A flow waits while its messenger is away, and takes its hold back when it is back | One connect per messenger at a time; a client reconnecting by itself is never replaced |
| A messenger’s pane asks before ending what a flow listens through | Two held flows on one queue share one consume; the last to leave ends it |
| A request a flow calls cannot be dropped into another project |
Orchestration: apps over your APIs · 40
| Apps built inside a project, over its own requests | A screen designer: cards dragged and sized on a grid |
| A whole app built from the project’s spec in one step | Built apps: lists open their records, create goes to the new record, delete asks first |
| Themis builds and changes apps by asking | Fields, buttons and cards linked: a field feeds its button, a button fills its cards |
| The links drawn on the designer as a card is picked | Property grid with categories, in a panel that moves |
| Cards that load as the screen opens | A write never runs as a screen opens |
| Required fields checked before anything is sent | Field checks written as a function |
| Choice fields from a list, or filled from an API | Choice lists from the spec’s enums |
| Secret fields for passwords, PINs and API keys, typed hidden | File fields for binary and form-data uploads |
| Comma-separated fields for lists of values | Optional query parameters as optional fields |
| Nested body fields as plain fields: category.id becomes Category id | Table cards, their columns read from the answer |
| Badge columns in green, amber, red and blue | Copy a value with one click |
| Load more for paged APIs | Row buttons: a record opened in a popup or a screen |
| Row click opens another screen with the row’s values | Row click presses a button on the same screen: master and detail |
| Popups over a screen, closed with Esc | Screens hidden from the menu |
| Dashboards: number cards and charts | Charts grouped by a field that repeats in the data |
| Screens that refresh every few seconds | Confirm before a button sends changes |
| Buttons that open a URL with the screen’s values | After a create, straight to the new record |
| Dates shown as dates and amounts as money, read from the answer | Card heights: as drawn, growing with the rows, or down to the window’s bottom |
| App brand: color and logo | An app pinned to an environment |
| An app calls only its own project’s requests | Built from any OpenAPI spec, proven on the public Petstore |
Functions · 16
| Functions kept with each app | JavaScript, Go and Python (Starlark) |
| A button that runs a function | A card filled by a function |
| An answer reshaped by a function before it shows | A field checked by a function |
| app.call: any request of the app’s project | app.publish: a message to any of the project’s messengers |
| The fields, the session, the row and the answer in hand | Say, notify, go to a screen, open a popup, keep a value |
| A function changes things only from a pressed button or an allowed watcher | Try it in the editor |
| Errors pointed at the function’s own line | Themis writes, changes and tries functions |
| app.read: a device’s tags, read now | app.publish to a device writes its tag |
Watchers · 17
| Watchers kept with each app | A check every few seconds |
| At set times, on chosen days | Listening on a messenger’s topic, each message checked |
| When it fails, when a value holds, when it changes, when something new arrives, or when a function says so | Fires as the condition starts to hold, not on every check |
| Desktop notifications | Then: a popup, a screen, a badge, a mark |
| Then: a request, a function, a message published | Changes only from a watcher allowed to send them |
| One clock for every open app, never overlapping | Backs off while the API fails |
| Watchers panel: the last word, pause, a log | Themis adds, changes and tries watchers |
| Listening on a device’s tags, each change checked | Paused from a messenger’s pane, until the app is opened again |
| Listens again on a new connection, from now on |
App runners · 23
| App runner: a user type that runs apps and nothing else | Apps ticked per app runner, on the member sheet or the app’s Runners page |
| The app full screen: no sidebar, no tabs | An Applications dropdown to switch apps |
| Toolbar: licensed-to line, change password, log out | An app runner counts as a user |
| No role, no projects, no Discover, no Themis, no terminal | One type per person: no role or grant on top, from any door |
| Owner, administrators and members of several divisions are never app runners | Requests only from the apps it runs, enforced by the backend |
| Each request exactly as stored: method, host, path, parameters, headers, body fields, auth | Values checked under the app’s own environment |
| Only the places and variables the app fills may change | Brokers and devices only by exact reference from its apps |
| Scripts only of the requests its apps use | Tunnels only the ones its apps go through |
| The window holds its apps and what they use, nothing else | Project keys only for the projects its apps live in |
| Every other backend operation refused, kept closed by a test | Exports refused |
| App runs in the activity log, with a trigger on them | Its scripts run on what the backend holds: the app’s environment, the answer received |
| A request’s scripts run whole: in order, each once, in its language |
Via / remote execution · 19
| Via: execute API requests from SSH server | Per-request Via selector |
| Folder Via inheritance | Project Via inheritance |
| Override inherited Via back to Local | Reach private API over SSH |
| Test IP-whitelisted API from remote server | Persistent SSH connection |
| No remote Sonda agent required | SSH direct-tcpip channels |
| TLS carried inside SSH | Preserve destination SNI |
| SSH known-host verification | First-contact fingerprint approval |
| Changed host-key rejection | SSH password auth |
| SSH key auth | SSH-agent auth |
| Remote reachability test |
FHIR & OData · 59
| FHIR server discovery via CapabilityStatement | Import FHIR server from /metadata |
| CapabilityStatement → Project | FHIR resource folders generated automatically |
| FHIR Search interactions | FHIR search-parameter generation |
| FHIR Read | FHIR versioned read |
| FHIR Create | FHIR Update |
| FHIR Patch | FHIR Delete |
| FHIR resource history | FHIR server history |
| FHIR resource operations | FHIR transaction Bundle |
| FHIR batch Bundle | FHIR resource body skeleton generation |
| application/fhir+json handling | FHIR OperationOutcome interpretation |
| FHIR Bundle interpretation | FHIR resource identification |
| FHIR pagination via Bundle.link[relation=next] | One-click FHIR Next page |
| OData v4 | OData CSDL / EDMX $metadata import |
| OData service → complete Project | OData EntitySet discovery |
| OData $filter | Property-aware OData $filter hints |
| OData $select | OData $expand |
| OData $orderby | OData $top |
| OData $skip | OData $count |
| OData $search | OData typed key URL generation |
| OData compound keys | OData typed Create skeleton |
| OData EDM primitive-type skeletons | OData complex-type skeletons |
| OData enum-value skeletons | OData collection-type skeletons |
| OData base-type property inheritance | OData PATCH generation |
| OData PUT generation | OData DELETE generation |
| OData navigation-property requests | OData singletons |
| OData function imports | OData action imports |
| OData service document | OData error interpretation |
| OData collection interpretation | OData entity interpretation |
| OData @odata.nextLink pagination | Relative OData next-link resolution |
| One-click OData Next page |
Echo & databases · 33
| Programmable Echo APIs | Static Echo responses |
| Request-aware Echo responses | Stateful Echo datasets |
| Mutable datasets across calls | Dataset reset to seed state |
| Automatic dataset CRUD | Echo script handler |
| Echo scripts in JavaScript | Echo scripts in Go |
| Echo scripts in Python / Starlark | Artificial response delay |
| Echo request / hit log | Internal echo:// protocol |
| In-process Echo call without TCP | Optional real network listener for the same Echo |
| AI-generated Echo API | Database-backed internal APIs |
| Internal sonda:// protocol | MongoDB endpoints |
| MongoDB find / findOne | MongoDB aggregate |
| MongoDB insert / update / delete | MySQL endpoints |
| MariaDB endpoints | PostgreSQL endpoints |
| SQL Server endpoints | Typed DB placeholders |
| Bound SQL parameters | Typed BSON / Mongo parameters |
| DB read-only mode | DB timeout / safety caps |
| DB endpoints callable from ordinary requests |
Response engineering · 65
| Pretty response view | Raw response view |
| HTML response preview | Automatic JSON table view |
| Nested table exploration | Table filtering |
| Table sorting | Select visible columns |
| CSV export from response | XLSX export from response |
| JSON → XML view | XML → JSON view |
| JSON / XML → YAML view | Generate TypeScript interface from response |
| Generate Go struct from response | Generate Python dataclass from response |
| Generate C# classes from response | Merge array-object shapes for type inference |
| Nullable-field inference | Optional-field inference |
| Integer / float inference | Date / time inference |
| Keep every send | Per-send full response snapshots |
| Automatic last-known response | Last-known response survives app restart |
| Explicit stale/local-response indicator | Send to refresh stale response |
| Forget retained last response | Saved response examples |
| Side-by-side response diff | Inline response diff |
| JSON response diff | XML-conversion diff |
| YAML-conversion diff | TypeScript-contract diff |
| Go-struct diff | Python-dataclass diff |
| C#-class diff | Full response-only mode |
| Request/setup-only mode | Per-tab request / response workspace layout |
| Different tabs can independently stay response-only / split / request-only | JSONPath at cursor |
| Response bookmarks | Create variable directly from response value |
| Use response as body of new request | Default GET → PUT response workflow |
| Clone auth to response-derived request | Clone headers to response-derived request |
| Clone query / cookies to response-derived request | Code generation |
| cURL generation | Raw HTTP generation |
| JavaScript fetch generation | Go generation |
| Python generation | DNS timing |
| Connect timing | TLS timing |
| Send timing | Wait / TTFB |
| Download timing | Connection reuse |
| Remote address |
Discover · 49
| Discover: use an app and Sonda builds the API behind it | Capture from a browser Sonda opens: Chrome, Edge or Brave |
| A fresh browser profile per capture, shredded when it ends | Read over the DevTools protocol: no extension, no certificate |
| Every request with its real kind: XHR, fetch, page, script | Bodies as the browser decoded them |
| WebSocket frames captured | Event-stream messages captured |
| Popups, frames and service workers captured | Capture proxy for phones, desktop apps and scripts |
| HTTPS read with a certificate authority made for the capture | Certificate authority key in memory only, or kept sealed on request |
| Certificate handed to the device at http://sonda.cert | Other devices ask first: Allow or Refuse |
| A refused device is cut off, open connections included | Allowed devices never reach this computer’s own services |
| Link-local addresses, cloud metadata included, refused for devices | The real site’s certificate always checked upstream |
| HAR import, read as a stream, files up to 1 GB | Capture through a tunnel |
| Nothing captured is written to disk | Live table: search, API calls, pages or everything, by status |
| Headers and bodies of any captured call on click | Trackers left out by a list you edit |
| Hosts outside the site flagged and left unticked | Preflights folded into their calls |
| Paths made templates only where a value is plainly an id | GraphQL split by operation, batches and persisted queries included |
| JSON-RPC split by method | Repeated calls folded, the richest sample kept |
| Requests named as a person would name them | Bearer token traced to the answer that handed it out |
| Login request gets the script that keeps the token | Basic, API key and cookie sessions detected |
| CSRF token carried from a cookie into its header | OAuth 2.0 sign-in offered as the project’s own auth |
| A folder per resource, and per host when there are several | Answers kept as examples, credentials hidden |
| Captured credentials as masked variables | A flow that replays the session, values passed on by name |
| An Echo that answers like the captured API did | Session cookies put in Sonda’s jar |
| Local only by default in a team’s Workspace | A shared project never carries the captured credentials |
| Up to 20,000 requests per capture | The organization’s rules: Wide open, a curated domain list, or open with DNS validation |
| The curated list: the browser opens on it, the proxy refuses the rest, a file’s other domains left out | The rules the owner’s, read when Discover opens and when a capture starts |
| A rule file gone from the store, or an older copy put back, refuses the capture |
Specs, imports & docs · 34
| OpenAPI import | Swagger 2 import |
| Import OpenAPI from URL | Postman collection import |
| Insomnia import | HAR import |
| cURL import (paste a command) | Bruno .bru import |
| Bruno .bru export | Bruno scripting compatibility layer |
| OpenAPI-linked requests | Update Project from changed spec |
| Preserve user-owned edits on spec refresh | Preserve removed operations instead of silently deleting |
| Response status validation against spec | Response schema validation |
| Generate OpenAPI from Project | OpenAPI 3.1 generation |
| OpenAPI 3.0 generation | Swagger 2 generation |
| Self-contained HTML documentation | Documentation generated directly from Project |
| Folder-grouped navigation | Documentation code samples |
| Documentation from live session response | Keep response as documentation example |
| Interactive docs preview | API description → generated working Project |
| OpenAPI → generated Project | WSDL → generated Project |
| FHIR CapabilityStatement → generated Project | OData CSDL / EDMX → generated Project |
| gRPC reflection → callable API surface | MCP discovery → callable tool/resource surface |
Git & local-first · 24
| Git-readable Project format | Plain-text / YAML project representation |
| Standard .git repository | Git init |
| Git status | Commit |
| Diff | History / log |
| Branch create / switch | Fetch |
| Pull | Push |
| Clone | Merge / conflict workflow |
| Built-in desktop terminal | Local-first operation |
| No account required for core local use | Full desktop workflow without vendor cloud |
| Air-gapped-capable workflow | Password-encrypted entire workspace |
| Incognito / no-persist request | No history in incognito mode |
| No retained response in incognito mode | No retained cookies in incognito mode |
Account isolation & correctness · 25
| Account chooser appears before any account-specific boot | No team-store pull before account selection |
| No Workspace load before account selection | No access-policy trigger before account selection |
| Pending publish queue cleared on account switch | Approval-flow cache isolated across accounts |
| Component-lock cache isolated across accounts | Merge state isolated across accounts |
| Queued action from previous account cannot execute under next identity | Display defaults do not silently mutate semantic Project state |
| Governed drafts use semantic comparison against store state | Sign-in with username and password; no account list shown |
| Password checked on every sign-in; switching account locks the account left | Revoked or changed credentials refused on the first screen |
| A wipe takes everything: every account, every team known, sessions and temporary copies | After a wipe, Sonda opens on the first page, as new |
| A team account opens again from the team’s store, no ticket needed | One username and password on several teams: the door asks which account |
| A password set, changed or removed reseals every file of the account, all or none | A stop in the middle of a reseal is finished or undone at the next start |
| The AI seat and the Git tokens are each account’s own | Unsaved tab changes kept across a restart, sealed with the account’s password |
| Close, lock or switch asks before going on without changes that could not be kept | Deleting a workspace offers its export first and is typed to confirm |
| Backups carry the tabs’ unsaved changes and the mail server |
Collaboration & repositories · 57
| Collaboration through Git | Collaboration through S3-compatible storage |
| Cloudflare R2 team store | AWS S3 team store |
| Azure Blob team store | Google Cloud Storage team store |
| Backblaze B2 team store | SSH team store |
| WebDAV team store | Encrypted collaboration over customer-owned storage |
| LockFlare does not store Project contents | Per-Project encryption key |
| Project key wrapped separately per member | Reader removal rotates Project key |
| Project / folder / item sealed objects | Signed membership state |
| Signed role state | Signed project metadata |
| Refuse stale membership revision | Incremental object sync |
| Batched parallel store reads / writes | Packed encrypted snapshot for initial pull |
| Per-item encrypted revisions | Restore old item revision |
| Exclude specific folder from collaboration | Exclude specific item / request from collaboration |
| Project Collaboration Home / Setup / Approvals / History workspace | Team-store-native published Project history |
| Per-component published history | Open historical component without restoring |
| Restore and republish historical component | Configurable retained team-store versions |
| Pause editing for everyone on a shared Project | Project change freeze enforced by backend |
| Project freeze applies to administrator too | Share Project as transactional publish action |
| Shared repository revision shown explicitly | Delete shared Project from team store |
| Remote Project deletion moves local member copy to Trash | Semantic conflict detection ignores non-meaningful serialization differences |
| Resolved conflicts stay resolved across subsequent syncs | Collaboration tab on every folder and item |
| Pause editing on a single folder or item | A paused folder freezes everything under it, administrator included |
| Hide a folder or item from the team | Hidden items disappear from the tree, documentation, exports, search and Themis |
| Sonda Server team store: one server of your own holds the store | Every write compared against the version it was based on, at the store |
| Nothing written until Save: every item edited on its tab’s copy | Save writes this computer alone; Save & Publish sends that one thing |
| Publish now sends everything saved here: items, folders, deletes, moves | A pull keeps a delete or a move made here and not published |
| A teammate’s change pulled while a tab is open is kept when it is saved | The project’s own fields never written over a teammate’s newer ones |
| Shared environments: Save stays here, Save & Publish sends | An MCP server’s last arguments stay on this computer |
| A copy of a shared project is this computer’s own until shared |
Sonda Server · 31
| One program on a Linux or Windows server of your own | Builds for Linux amd64, Linux arm64 and Windows amd64 |
| Holds the team store’s credentials: no member computer receives them | Keeps the team store in a folder of its own disk: no bucket needed |
| Or stands in front of S3, Azure, Google Cloud Storage, SSH, WebDAV or Git | A setup that asks, question by question, secrets typed unseen |
| The setup creates the organization, its first division and its administrator | One line carries the address, the token and the certificate’s fingerprint |
| That line pasted into Sonda fills all three | Installs itself as a service: systemd on Linux, the Windows service manager |
| TLS 1.3 only, on both ends | Its own certificate, pinned by fingerprint: the one certificate taken |
| Or the team’s own certificate, or a proxy of the team’s in front | A call without the token gets a bare not-found, nothing more |
| The token kept only as its SHA-256, said once, replaced in one command | Allowed networks: other addresses closed before the handshake |
| An address that keeps calling without the token is dropped for a while | Each person signs in to the server with a username and a password |
| The server checks the password itself and keeps it nowhere | The token alone reaches no file of the team’s |
| A paused or revoked account is refused at its next call | A password set again by an administrator ends that account’s sign-ins |
| Repeated failed sign-ins for one username are held for a while | The administrator’s password set again on the server, in one command |
| The provisioning bridge signs in with its own key | Two publishes in the same instant never both land |
| One server per store folder, held by the operating system’s lock | A write is whole or not there |
| Its private files are its account’s alone, on Linux and on Windows | On Windows, refuses to run a service from a folder others can change |
| Optional: small teams keep reaching their own store directly |
Organizations & divisions · 43
| Organization above multiple collaboration divisions / teams | Create multiple organizational divisions / teams |
| Independent membership per division / team | Independent roles per division / team |
| Independent Projects per division / team | Division / team administrator role |
| Organization owner role | Centralized or delegated organizational administration |
| Owner can enter and administer any division | Cryptographically scoped division-administrator delegation |
| Division-admin signature valid only inside its assigned division | Organization owner trusted across all divisions cryptographically |
| Revoke division administrator cryptographic authority | Revoked delegate signatures rejected on subsequent sync |
| Each division has a separate cryptographic roll / seal | Same customer-owned repository can host cryptographically isolated divisions |
| Division has independent roster / roles / projects / approvals / locks | Division has independent Mail and Themis configuration |
| Organization-wide Mail default inherited by divisions | Organization-wide Themis default inherited by divisions |
| Division can override inherited Mail configuration | Division can override inherited Themis configuration |
| Organization-defined role set inherited by a new division | Division can establish its own role set after inheritance |
| Division rows show member and Project counts | Directory source can target a specific division |
| Entra / Okta groups can provision into specific divisions | Leaver processing scoped to target division |
| Organization owner can orchestrate multi-division directory sync | Division administrator directory sync limited to own division |
| Same person can belong to multiple divisions / teams | One identity and key across every division a person belongs to |
| Organization Project stored once at organization root | Organization Project shared to selected divisions |
| Organization Project omitted from unselected divisions | Division receives organization Project as read-only content |
| Only the owner publishes organization Project | Organization Project key wrapped for active members of selected divisions |
| Organization Project key also wrapped for division admins | Organization Project paths remain rooted outside division stores |
| Removing a division from sharing removes member copies on next sync | Three ways to start: Standalone, Small teams and developers, Enterprise |
| Enterprise: the organization is made on Sonda Server, people only sign in |
Organization administration · 13
| Administrator is selected from an existing person | Human identity is reused when elevated to Division Administrator |
| Division Administrator uses the member's existing key | Division Administrator authority remains cryptographically scoped |
| Removing administrator status returns the same identity to member | Several administrators per Division |
| Dedicated Division management dialog/control plane | Division setup, administrators, services, Workspaces and people in one place |
| Move an organization-root member into a Division | Member move preserves the same identity and key |
| Member receives owner-signed move instruction and follows it on sync | Naming an administrator can move a root member into the Division at the same time |
| Enterprise Setup → Discovery: the organization’s reverse-engineering rules |
Organization service catalog · 10
| Organization-wide catalog of named Themis AI seats | Organization-wide catalog of named Secret managers |
| Organization-wide catalog of named Git accounts | Catalog never returns stored AI keys or Git tokens to the UI |
| Division selects one organization Themis seat | Division selects multiple organization Secret managers |
| Division selects multiple organization Git accounts | One save re-seals selected services to Division members/admins |
| Unlinking a service removes it from the Division | Division may inherit, override or disable organization service |
Organization licensing · 8
| All features available free up to 20 organization users | Free-user limit counted across the whole Organization |
| Division users count toward the same Organization limit | Signed per-team head counts used for Organization total |
| Paid license raises Organization-wide user capacity | Division Administrator enforces Organization capacity without holding license key |
| License can be cryptographically bound to Organization owner identity | License expiration falls back to free capacity without deleting existing users |
RBAC & enterprise identity · 87
| Application RBAC | Per-Project access role |
| Administrator role | Editor role |
| Runner role | Viewer role |
| Custom roles | Granular request permissions |
| Granular script / check permissions | Central backend RBAC enforcement |
| Permissions enforced independently of UI state | Same permission policy applies to Themis actions |
| Same permission policy applies to keyboard shortcuts | Same permission policy applies to imports / paste |
| Same permission policy applies to drag / drop | Request-send permission separate from request-edit |
| Script-edit permission independent of request-edit | Check-edit permission independent of request-edit |
| Environment-edit permission independent of request-edit | Project-create permission enforced on imports / clones / demos |
| Cross-project move validates source and destination permissions | Load-test execution permission enforcement |
| Local non-shared objects exempt from collaboration policy | Semantic change detection avoids false RBAC refusals |
| Internal OAuth refresh is not mistaken for a manual auth edit | Derived path-variable updates are not mistaken for user edits |
| Permission refusals recorded in collaboration activity | Member pause / resume |
| Access expiration | Allowed working days |
| Allowed working hours | Timezone-aware schedule enforcement |
| Cross-midnight access windows | IP / CIDR access restrictions |
| Gate Workspace before content appears | Team-roster view permission independent of administrator access |
| Sealed member roster distributed to active members | Member-visible team role names |
| Member-visible project-scope information | Member can see workflow-approver status |
| Member Collaboration view limited to permitted pages | Hide Projects user cannot access |
| Show inaccessible Project name but keep contents sealed | Signed invitations |
| Self-service enrollment | Each user generates a personal keypair |
| SSO-verified enrollment | Admin approval of enrollment |
| OIDC SSO | SAML 2.0 SSO |
| IdP metadata import | SP metadata generation |
| Signed SAML AuthnRequests | SAML Response signature verification |
| SAML Assertion signature verification | Encrypted SAML assertions |
| SAML Single Logout | SP-initiated logout |
| IdP-initiated logout | SCIM 2.0 |
| SCIM Users | SCIM Groups |
| SCIM group → role mapping | Customer-hosted SCIM bridge |
| SCIM without LockFlare control plane | Delegated provisioning key |
| Revoke provisioning key | Provisioned user enable / disable |
| Automatic enrollment matching SCIM identity | Multiple external identity directories |
| Microsoft Entra directory sync | Okta directory sync |
| Multiple directories simultaneously | Parallel directory sync |
| Union-of-directories membership | Per-directory default role |
| Automatic leaver deactivation | Fail-safe: no removals when a directory read fails |
| Scheduled directory reconciliation | Manual directory sync |
| Internal cryptographic roster available independently of Team-page visibility | Approval signature verification does not require Team roster UI permission |
| Roles set per folder or item; the nearest one wins | Send permission enforced on every live protocol |
| Try the company sign-in before it applies | An offline window holds when the identity provider does not answer |
| The SAML service provider’s private key sealed to every account, never in the clear |
Member lifecycle & access · 13
| New member starts with no Project access by default | New member cannot create Projects until explicitly granted |
| New member cannot approve until explicitly granted | Disable member without destroying identity/key |
| Re-enable member using the same identity | Notification for sign-in attempt from disallowed network |
| Notification for sign-in attempt outside allowed days/hours | Denied sign-in notification includes computer and addresses |
| Denied sign-in notifications deduplicated per session | Invitations good for fourteen days, a new one retires the last |
| The newcomer’s key sealed under the newcomer’s own password, never held by the administrator | A request to join can be withdrawn |
| A declined request carries the reason |
Secrets · 41
| External secret-manager integrations | HashiCorp Vault |
| AWS Secrets Manager | Azure Key Vault |
| Google Secret Manager | 1Password Connect |
| Doppler | Infisical |
| Generic HTTP secret provider | Uniform secret://provider/path#field syntax |
| Resolve secret only when executing request | External secret never written into Workspace |
| External secret never written into team store | Resolve multiple secret refs concurrently |
| RAM-only resolved-secret cache | Configurable secret cache TTL |
| Clear cached secrets manually | Automatically mask resolved secret values |
| Secret resolution for HTTP | Secret resolution for GraphQL |
| Secret resolution for gRPC | Secret resolution for WebSocket |
| Secret resolution for SSE | Secret resolution for MQTT |
| Secret resolution for Socket.IO | Secret resolution for MCP |
| OAuth fetch / refresh can resolve secret references | Native Sonda Secrets vault |
| Native local first-party secrets | Native team-shared encrypted secrets |
| Per-secret reader ACL | Fresh 256-bit key per Sonda Secret |
| Secret separately encrypted from Project data | Secret key wrapped separately for each reader |
| Signed secret files | Signed secret index |
| Secret stored encrypted in customer-owned repository | Repository access alone cannot decrypt secret |
| Secret plaintext never returned to frontend | secret://sonda/<name> execution-time reference |
| JSON subfield secret references |
Themis AI · 49
| General AI assistant (Themis) | BYOK AI |
| Anthropic | OpenAI |
| xAI | Local / OpenAI-compatible AI endpoint |
| AI sees selected Workspace context | AI can explain responses |
| AI generates requests | AI generates scripts |
| AI generates checks / tests | AI writes documentation |
| AI creates Projects directly | AI creates folders directly |
| AI creates requests directly | AI sets variables through typed app tools |
| AI configures auth through typed app tools | AI creates checks through typed app tools |
| Documentation URL → full categorized API Project | AI discovers / imports OpenAPI rather than recreating it |
| AI-generated Echo API, from a description | AI can create Echo datasets |
| AI can create Echo endpoints | AI can start an Echo |
| AI web fetch limited to user-named hosts | AI tool results treated as untrusted data |
| AI output not executed directly as arbitrary code | Risky actions require explicit human confirmation |
| Per-Workspace Themis conversation | Themis conversation kept only in memory by Sonda |
| Administrator-managed shared team AI configuration | One shared AI provider / model configuration for authorized members |
| Dedicated RBAC permission to use team AI | Shared AI credentials sealed in customer-owned repository |
| AI credential wrapped only for members with AI permission | Member can use team AI without seeing API key |
| Shared AI credential kept only in member memory | Shared AI credential not persisted to member disk |
| Role changes automatically update team-AI access | Stop sharing centrally revokes team AI on next sync |
| No LockFlare AI credential relay required | Themis understands SOAP / WSDL workflows |
| Themis understands JSON-RPC / XML-RPC request modes | Themis understands STOMP request / connection workflow |
| Themis understands FHIR discovery / paging semantics | Themis understands OData metadata / query / paging semantics |
| AI import tool probes OpenAPI / WSDL / OData / FHIR descriptions | Themis respects collaboration holds rather than bypassing governance |
| Themis builds flows, watchers and functions over industrial devices |
Component locking · 22
| Temporary exclusive edit lock on a shared component | Named lock owner |
| Configurable lock duration (1–168 hours) | Lock reason / note |
| Lock takes effect immediately | Lock owner retains edit rights |
| Everyone else becomes read-only | Administrator is also blocked from editing locked component |
| Administrator can forcibly lift another member's lock | Lock owner can release early |
| Lock expires automatically | Folder lock applies to descendants |
| Locked component cannot be deleted by another member | Lock cannot overlap an approval-frozen item |
| Backend-enforced component lock | Lock visible in Project tree and editor |
| Workspace-wide Locks view | Lock records signed by the lock owner |
| Lock records sealed to the team | Administrator notified when a lock is taken |
| Configurable lock notification audience | Lock audience notified when lock is released or lifted |
Structured merge & conflicts · 25
| Three-way merge using a common base revision | Automatic clean merge before declaring a conflict |
| Field-level structured object merge | Query parameters merged by key |
| Headers merged by key | Path variables merged by key |
| Checks merged by stable ID | Examples merged by stable ID |
| Saved protocol messages merged by stable ID | One-sided field change automatically wins |
| Same change from both sides auto-resolves | Only mutually changed fields become conflicts |
| Non-conflicting edits from both users are preserved | Automatic merge attempted during publish |
| Automatic merge attempted during pull | Per-field conflict resolution UI |
| Conflict view shows both values and remote author | Every conflicting field requires explicit resolution |
| Apply merged result and publish | Whole-item keep-local fallback |
| Whole-item take-remote fallback | Previous publisher notified when revision is merged / replaced |
| Merged or replaced revision remains restorable in History | Semantic conflict detection ignores serialization-only differences |
| Resolved semantic conflicts stay resolved across later syncs |
Change governance & approvals · 49
| Visual approval workflow builder | Executable approval workflow runtime |
| Project-scoped approval flow | Folder-scoped approval flow |
| Request-scoped approval flow | Nearest-scope approval policy wins |
| Single-approver step | Multi-approver step |
| All-approvers rule | Any-one approver rule |
| N-of-M approval quorum | Sequential approval stages |
| Parallel approval branches | Fan-in waits for all reached predecessors |
| Conditional branch on change type | Conditional branch on scripts / auth touched |
| Conditional branch on submitting member | Notification node inside approval graph |
| Approved / Rejected terminal outcomes | Custom instructions / notification templates |
| Approval reminder interval | Changes held from team publication until approved |
| Submitted item frozen for everyone during approval | Originator also blocked while approval is pending |
| Backend-enforced approval lock | Approval lock visible in Project tree / editor |
| Exact proposed content attached to submission | Field-level proposed-change diff for approver |
| Submission records base repository revision | Governed local draft is not treated as a sync conflict |
| Remote store changes do not overwrite governed draft | Manual save cannot bypass approval |
| Manual publish cannot bypass approval | Conflict resolution cannot bypass approval |
| Approved change publishes through privileged approval path | Allow changes returns editing to originator only |
| Resubmission restarts full review | Multi-round approval on one submission |
| Originator can cancel approval | Cancellation releases item locks |
| Required approvers automatically notified | Originator notified of allow-changes / reject / approve |
| Append-only approval event history | Approval event signed by its author |
| Approval entries sealed to team members | Deterministic approval state rebuilt from event chain |
| Built-in approval configuration diagnostics | Deletes, moves and new folders under a flow go up only through their submission |
| A request under a flow cannot be dragged out of that flow’s reach |
Notifications & activity · 41
| Built-in SMTP notification engine | SMTP TLS |
| SMTP STARTTLS | SMTP AUTH PLAIN |
| SMTP AUTH LOGIN | Microsoft 365-compatible SMTP path |
| Team-shared sealed SMTP configuration | SMTP password never displayed to members |
| Revoked member loses access to shared mail config | Invitation email |
| Join-request email | Approval / decline email |
| Directory-sync result email | Per-member notification rules |
| Notify selected team members | Notify administrator shortcut |
| Login activity notification | Request-create notification |
| Request-update notification | Request-delete notification |
| Request-send notification | Folder-create / delete notification |
| Project-create / delete notification | Project-publish notification |
| Project-publish activity trigger covers burst publishes | Project / Bruno / backup export activity trigger |
| Activity tracking covers WebSocket / gRPC / MQTT / SSE / Load Test / MCP items | Secret-use notification |
| Echo-start notification | Load-test notification |
| Export notification | Activity event batching / digesting |
| Duplicate-event counting | High-signal events sent immediately |
| Notification mail sent from member's own Sonda | No LockFlare notification relay required |
| Notification rule persistence | Administrator notification recipient fallback |
| Notification delivery / failure activity logging | Per-session sign-in notification state resets on account switch |
| Unmanaged-directory status persists across sessions |
Activity log · 9
| Each person’s activity: sign-ins, sends, request changes, publishes, team-secret use, exports, mock APIs started, load tests, people added or revoked | Written to the person’s own month in the team store |
| Signed by the person alone: nobody else writes there | Sealed to the person, the owner and the division’s administrators |
| Kept sealed on the computer until the write lands | Activity page by month, person and kind |
| Members see their own activity | The same action within ten minutes is one line, counted |
| Personal workspaces stay off the activity log |
Repository portability · 24
| Named reusable repository definitions | Repository connection test |
| Repository browser | Backup complete team store |
| Backup contains sealed / signed store files | Backup remains unreadable without team keys |
| Restore backup into current store | Restore backup into another supported backend |
| Restore only replaces matching files | Refuse another team's backup by identity |
| Explicit override for cross-team restore | Move entire live team to another storage provider |
| Git → S3 / R2 migration | S3 / R2 → Git migration |
| S3 ↔ GCS / Azure migration | SSH / WebDAV / Sonda Server migration |
| Copy destination completely before redirecting clients | Signed / encrypted relocation record in old store |
| Relocation target wrapped separately for members | Members automatically follow team move on next sync |
| No manual client reconfiguration after store move | Repository provider can change without rebuilding Projects |
| Storage backend is not permanent team identity | No vendor-storage lock-in: projects stay on your side |
Product names on this page are trademarks of their respective owners. LockFlare is not affiliated with, or endorsed by, any of them; the names appear only to say what Sonda imports, exports, opens and connects to.
/ LOCKFLARE SONDA