The five-minute demo¶
Edition: Community and Enterprise
Four people pass one data fix through sealfix: alice asks for it, dave reviews the SQL, bea approves the business change, and audrey checks the trail. The value in the fix, a national ID, stays sealed the whole way.
Demo only
Fake data, throwaway passwords and a plain-LDAP directory. Never point the demo at real systems.
Start it¶
You need Docker and about 8 GB of free memory (the demo runs PostgreSQL, SQL Server and Oracle targets beside sealfix).
One command builds the images, starts the stack and waits for the fake data. The first run
takes a few minutes, and the Oracle target needs a minute or two to start. When it prints
sealfix demo is up, open http://localhost:8080.
| User | Password | Role |
|---|---|---|
alice |
sealfix-demo |
Requester |
dave |
sealfix-demo |
DBA reviewer |
bea |
sealfix-demo |
Business approver |
audrey |
sealfix-demo |
Auditor |
adam |
sealfix-demo |
Administrator |
Use a private browser window per person, or sign out between steps.
The scenario¶
sequenceDiagram
autonumber
actor A as alice (requester)
participant S as sealfix
participant X as Executor
actor D as dave (DBA)
actor B as bea (business)
actor U as audrey (auditor)
A->>S: Template + national ID
S->>S: Checks, then seal the value
S->>X: Dry run
X-->>S: 1 row, plan, sample
D->>S: Approve the SQL (sees no value)
B->>S: Approve the change (sees ****1234)
A->>S: Execute
X->>X: Save before-image, run, compare counts, commit
U->>S: Verify the audit chain
1. alice asks for a fix¶
Sign in as alice and open "New request".
- Target:
core-banking-pg. Ticket:CHG-1001. Why: "suspend a customer flagged by fraud". -
SQL template, with no value in it:
-
Parameter kinds:
statusis text,nidis a national ID. - One row of values:
status = suspended, and one of the IDs the seeder printed.
Submit it. The checks run, then the national ID is sealed: from here on the database holds ciphertext and a masked copy.

Try it
Paste the national ID straight into the template instead of using :nid. Check C4
refuses it: a sensitive value never travels as SQL text.
2. dave reviews the SQL¶
Sign in as dave. The executor has already made a dry run on the target, inside a transaction it rolled back. dave sees the template, the rows per statement, the plan and the check results. He sees no value, not even masked. He approves.

3. bea approves the business change¶
Sign in as bea. She sees what the change means: the national ID masked as ****1234, the
reason and the ticket. She approves, and the request is ready to run.

4. alice executes it¶
Back as alice, select "Execute on the target". In one transaction the executor saves the rows it will change (sealed again, for rollback), runs the statement and compares the row count with the dry run. On any difference it rolls back by itself.
From the executed request, alice can ask for a rollback: a new request built from the sealed before-image, with its own dry run and the same approvals.
5. audrey checks the trail¶
Sign in as audrey. The audit log shows every step: who asked, who approved, what ran and how many rows changed, with the values masked. The page recomputes every hash each time it loads, and "Hash chain intact" confirms nothing was edited or removed.
Start it with nothing set up¶
make demo-up-fresh starts the same stack with no directory, no targets and no roles. Sign in
as the bootstrap administrator at http://localhost:8080/login/local and walk the
setup wizard yourself.