---
title: Architecture overview
---
# Architecture overview
Overslash is a Rust + Axum service on top of PostgreSQL, with a SvelteKit dashboard embedded into the same binary. Requests flow through a small set of layers: transport (REST or MCP), authentication (OAuth bearer or static `osk_` key), permission check (the User → Agent → SubAgent chain), execution (service registry lookup → authenticated HTTP), and audit.
::: warning Pre-release
:::
## Components
A single `overslash` binary hosts the API, the domain logic, and (optionally) the dashboard. Editors and callers reach it over HTTP; the binary holds credentials, decides what is allowed, and makes the outbound call to the target service on the caller's behalf.
```mermaid
flowchart TB
subgraph clients[Clients]
direction LR
mcp[MCP client
Claude Code, Cursor, …]
rest[REST / CLI caller]
dash[Dashboard
SvelteKit]
end
shim[overslash-mcp
stdio↔HTTP shim]
subgraph binary[overslash binary]
direction TB
api[overslash-api
Axum: transport · OAuth · auth · permission check]
core[overslash-core
identities · permissions · approvals · registry]
db[(overslash-db
PostgreSQL)]
api --> core
core --> db
end
target[Target service
GitHub, Gmail, Slack, …]
mcp -->|Streamable HTTP| api
mcp -.stdio-only editors.-> shim
shim -->|POST /mcp| api
rest -->|REST / MCP| api
dash -->|REST| api
core -->|authenticated HTTP| target
classDef clients fill:#f5f7fa,stroke:#7a8599,stroke-width:1px,color:#1f2937
classDef api fill:#eef2ff,stroke:#6366f1,stroke-width:1px,color:#1f2937
classDef core fill:#ecfeff,stroke:#0891b2,stroke-width:1px,color:#1f2937
classDef db fill:#f0fdf4,stroke:#16a34a,stroke-width:1px,color:#1f2937
classDef edge fill:#fff7ed,stroke:#f97316,stroke-width:1px,color:#1f2937
class clients clients
class api api
class core core
class db db
class shim,target edge
```
| Component | Responsibility |
|---|---|
| `overslash-api` (Axum) | HTTP surface — REST API, the OAuth authorization-server endpoints, the `POST /mcp` MCP transport, authentication, and the permission check. |
| `overslash-core` | Domain logic — identities and the permission chain, approval lifecycle, secret handling, service-registry resolution, and the authenticated outbound call. |
| `overslash-db` | Postgres models and migrations. Migrations run automatically on first startup. |
| `overslash-mcp` | A thin stdio↔HTTP shim for editors that only speak stdio MCP; forwards each JSON-RPC frame to `POST /mcp`. See [MCP OAuth transport](./mcp-oauth-transport.md). |
| `overslash-cli` | The binary entry point and its subcommands (`serve`, `web`, `mcp`, …). See the [CLI reference](../cli.md). |
| Dashboard (SvelteKit) | The web UI for orgs and users. Embedded into the binary and served by `overslash web`; it talks to the same REST API. |
## Request lifecycle
Every action call — whether it arrives over REST or MCP — passes through the same five layers:
1. **Transport** — the request lands on the REST router or the `POST /mcp` JSON-RPC handler.
2. **Authentication** — an `Authorization: Bearer` header carries either an OAuth access token (user/agent identity) or a static `osk_` key (agent identity). The request is rejected if neither validates.
3. **Permission check** — the caller's key (`service:action:arg`) is walked against the allow/deny rules on its identity chain. A user-only call skips the fine-grained layer; an agent call enforces it. See [Permissions](../../guide/concepts/permissions.md).
4. **Execution** — on a pass, the service registry is resolved to a concrete endpoint, credentials are injected, and the authenticated outbound HTTP call is made. On a gap, an [approval](../../guide/concepts/approvals.md) is raised and the call suspends until it is resolved.
5. **Audit** — the outcome is written to the audit log against the originating user. See [Audit](../../guide/concepts/audit.md).
## Sample action call
The sequence below traces a call that hits a permission gap, raises an approval, and resumes — the common case when an agent reaches for something it hasn't been granted yet. It follows the walkthrough in [Concepts](../../guide/concepts/index.md#walkthrough): user `alice` owns agent `claude-code`, which spawned subagent `researcher` (`inherit_permissions = true`). The researcher calls `github:create_pull_request:overfolder/backend`.
```mermaid
sequenceDiagram
autonumber
participant C as MCP client
(researcher)
participant A as overslash-api
participant P as Permission check
participant R as Resolver
(alice / claude-code)
participant S as GitHub
participant L as Audit log
C->>A: overslash_call (github:create_pull_request:…)
A->>A: Authenticate bearer
A->>P: Walk chain for the key
P-->>A: Gap — no ancestor allows it
A->>L: Record approval raised
A-->>C: pending_approval + approval URL
R->>A: Resolve (allow_remember, optional TTL)
A->>A: Plant rule on closest non-inheriting ancestor
Note over C,A: Suspended call resumes
A->>P: Re-check the key
P-->>A: Allowed
A->>S: Authenticated HTTP (credentials injected)
S-->>A: 201 Created
A->>L: Record execution result
A-->>C: Result
```
A call that is already covered by the chain skips steps 4–9: the permission check passes on the first walk and execution proceeds directly.
## Service registry resolution
When a call names a `service:action`, Overslash resolves it through a three-tier registry, most specific first: a user-owned template, then an org-owned template, then the built-in global registry. The resolved template supplies the host, the action-to-endpoint mapping, and how credentials are attached.
Actions reach a target through one of three execution modes:
- **Raw HTTP** — a direct `http:VERB:host/path` call, governed by `http:*` permission keys.
- **Connection-based** — an OAuth [connection](../../guide/concepts/connections.md) supplies the bearer token, refreshed as needed.
- **Service + action** — a registry template maps the action to an endpoint and injects the right [secret](../../guide/concepts/secrets.md) or connection.
See the [Service registry reference](../service-registry.md) for the template format.
## Where to read the code
The crates live under `crates/` in the source repo:
| Crate | Path |
|---|---|
| `overslash-api` | `crates/overslash-api/` |
| `overslash-core` | `crates/overslash-core/` |
| `overslash-db` | `crates/overslash-db/` |
| `overslash-mcp` | `crates/overslash-mcp/` |
| `overslash-cli` | `crates/overslash-cli/` |