This is the recommended database studio for SharpCoreDB. It replaces the legacy SharpCoreDB.Viewer Avalonia desktop application, which is now deprecated.
SCDMS is a local-first Razor Pages application for inspecting and operating SharpCoreDB databases with secure defaults.
- Local connection mode (directory or single-file)
- Network server connection mode (SharpCoreDB gRPC server)
- SafeWebCore strict A+ security profile
- SQL editor with named parameter JSON payloads
- Result grid for executed SELECT statements
- Table explorer and metadata browser (columns, indexes, triggers)
- Transaction controls (begin, commit, rollback)
- Saved query library with scoped visibility per connection target
- Query execution history with success/failure status
- Workspace import/export as JSON
The viewer ships with one default database and two sample databases:
| Database | Purpose | Created when |
|---|---|---|
scdb |
Default scratch database with a small welcome table |
Automatically on first launch |
contoso |
Retail sample (customers, products, orders, order items, inventory) | On demand (sidebar Database Actions or File menu) |
adventureworks |
Cycles manufacturer sample (products, customers, sales orders, territories) | On demand (sidebar Database Actions or File menu) |
Password: all built-in databases are created with the default password scdb.
You need it when reconnecting manually (recent connection profiles intentionally do not persist passwords).
Storage location: %LOCALAPPDATA%\SCDMS\Data\<name> (e.g. C:\Users\<you>\AppData\Local\Scdms\Data\contoso).
Changing the defaults: edit appsettings.json:
"SCDMS": {
"DefaultDatabaseName": "scdb",
"DefaultDatabasePassword": "scdb",
"DefaultDatabasePath": "",
"SampleDatabasesDirectory": ""
}DefaultDatabasePasswordapplies to newly created built-in databases. Existing databases keep the password they were created with — delete the database folder to re-create it with a new password.DefaultDatabasePathoverrides the storage folder of the default database.SampleDatabasesDirectoryoverrides the root folder for all built-in databases.
SCDMS can run as a container. In container mode SCDMS serves plain HTTP (default port 8080) and a reverse proxy terminates TLS, and SCDMS connects to a SharpCoreDB server over gRPC (its server connection mode uses SharpCoreDB.Client/gRPC exclusively; the HTTPS management API of the server is not used for data traffic).
All settings are configured through environment variables using the SCDMS__ prefix (the SCDMS configuration section). Examples: SCDMS__EnableHttps=false, SCDMS__DefaultServerHost=scdb.example.com.
| Environment variable | Default | Description |
|---|---|---|
SCDMS__EnableHttps |
true |
Desktop mode: serve HTTPS with the generated self-signed localhost certificate. Set false in containers; a reverse proxy terminates TLS. |
SCDMS__HttpsPort |
5443 |
Port used when EnableHttps=true. |
SCDMS__HttpPort |
8080 |
Port used when EnableHttps=false (container/HTTP mode). |
SCDMS__BindAddress |
localhost |
Interface to bind. Use 0.0.0.0 in containers. |
SCDMS__UseForwardedHeaders |
false |
Honor X-Forwarded-Proto/X-Forwarded-For. Enable only behind a trusted reverse proxy. |
SCDMS__DataDirectory |
(OS default) | Overrides the SCDMS data root (settings, saved queries/history, built-in databases, certificates). Mount a volume here in containers. |
SCDMS__DefaultServerHost |
(empty) | SharpCoreDB gRPC server host to prefill/auto-connect to. When set, SCDMS skips creating the local scdb scratch database. |
SCDMS__DefaultServerPort |
5001 |
gRPC port. Use 443 when the gRPC endpoint is fronted by a TLS-terminating reverse proxy. |
SCDMS__DefaultServerDatabase |
master |
Database name for the default server connection. |
SCDMS__DefaultServerUsername |
anonymous |
Username for the default server connection. |
SCDMS__DefaultServerPassword |
(empty) | Password for the default server connection. |
SCDMS__DefaultServerUseSsl |
true |
TLS for the gRPC channel. Keep true; disable only on trusted plaintext networks. |
SCDMS__DefaultServerPreferHttp3 |
true |
Prefer HTTP/3 (QUIC) when the server supports it. |
SCDMS__DefaultServerAutoConnect |
false |
Auto-connect to the default server when the UI opens. |
The SharpCoreDB server exposes gRPC over TLS only (Server__Security__TlsEnabled). Recommended deployment: put a reverse proxy (Caddy/nginx) in front that holds a publicly trusted certificate (Let's Encrypt) for the gRPC hostname and the SCDMS hostname:
- Browser →
https://scdms.example.com→ SCDMS (http://scdms:8080) - SCDMS →
https://scdb.example.com:443(gRPC) → SharpCoreDB server gRPC (:5001)
SCDMS validates the public certificate, so no custom CA or certificate-skip logic is needed. A complete, runnable sample (SCDMS + SharpCoreDB server + Caddy) is in samples/docker/.
Mount a volume at the SCDMS__DataDirectory location (/app/data in the official image) to persist settings, saved queries/history and built-in databases across container restarts.
SCDMS is configured secure-by-default:
- HTTPS-only endpoint binding
- Session cookie with HttpOnly, Secure, and SameSite=Lax
- SafeWebCore strict A+ headers enabled
- CSP nonce support in layout
- No password persistence in recent connection profiles
Use this when the viewer runs directly against local SharpCoreDB storage:
LocalDatabasePathLocalStorageMode(Directory or SingleFile)LocalReadOnlyPassword
Use this when connecting to SharpCoreDB server:
ServerHostServerPortServerDatabaseServerUsernameServerUseSslServerPreferHttp3Password
The SQL editor supports multiple statements in one execution.
Use the Parameters (JSON object) field for named parameters:
{
"@id": 10,
"@name": "Alice"
}Supported JSON-to-parameter conversions include:
nullbool- numeric values (
int,long,decimal,double) string- arrays
Transaction controls are available in the SQL panel:
- Begin starts a transaction for the current session
- Commit commits active transaction
- Rollback rolls back active transaction
When a transaction is active, query execution reuses the same transaction-scoped connection.
Saved queries and history are scoped by connection target:
- Global items (no target key) are always visible
- Target-specific items are visible only when connected to that target
Scope examples:
- local:
local:c:\data\mydb - server:
server:localhost:5001/master
The viewer can export/import query workspace state as JSON:
- Saved queries
- Query history
Use the Workspace Import/Export panel:
- Export to JSON
- Copy payload for backup
- Paste payload and import when restoring
The viewer stores local user data under:
%LOCALAPPDATA%\SCDMS\
Files:
settings.json(recent connections)query-workspace.json(saved queries and history)
In container deployments the root is overridden with SCDMS__DataDirectory (see the environment-variable table above).
From repository root:
dotnet build src/SCDMS/SCDMS.csproj
dotnet run --project src/SCDMS/SCDMS.csproj- Keep TLS enabled for server mode in production.
- Use strong database/server passwords.
- Prefer scoped saved queries per target to avoid accidental cross-environment execution.
- Clear history periodically if it may contain sensitive statement previews.