Skip to content
Closed
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
0df599a
playwright e2e tests
AustinKelsay Feb 21, 2026
ac26496
fix test placeholder strings
AustinKelsay Feb 21, 2026
c579a3e
test: add Playwright E2E smoke suite and patch dev dep vulnerabilities
AustinKelsay Feb 21, 2026
d3c38a2
fix: move env admin gate before validation, fix Bearer token
AustinKelsay Feb 21, 2026
3a6cb0b
fix: reject empty RELAYS in /api/env updates
AustinKelsay Feb 24, 2026
156ce53
fix: expand 127.0.0.0/8 loopback filter, harden E2E cosigner, and cle…
AustinKelsay Feb 24, 2026
33e14cd
fix: lazy ENV_FILE_PATH eval, peer-list hook deps/a11y, CI audit out…
AustinKelsay Feb 24, 2026
813aed6
chore: harden e2e smoke flows and CI/env safeguards
AustinKelsay Feb 24, 2026
609544b
fix: tighten smoke test docs and cleanup guards
AustinKelsay Feb 24, 2026
657c79c
fix: harden relay req validation and test safety
AustinKelsay Feb 24, 2026
959edf4
fix: harden e2e cleanup, docs, and context handling
AustinKelsay Feb 24, 2026
6d73a98
fix: harden e2e smoke setup and route test safety
AustinKelsay Feb 25, 2026
944ec63
fix: harden smoke test harness and teardown behavior
AustinKelsay Feb 25, 2026
557e4a5
fix: tighten e2e cleanup and env test safeguards
AustinKelsay Feb 25, 2026
816eb0f
fix: pin Bun version in docker and CI workflows
AustinKelsay Feb 25, 2026
5f8713b
fix: harden e2e smoke tests and peer-list collapse behavior
AustinKelsay Feb 25, 2026
3f6481f
fix: harden relay limits and teardown safety
AustinKelsay Feb 25, 2026
b068104
fix: tighten e2e ui and loopback validation
AustinKelsay Feb 25, 2026
61bd400
test: clarify configure navigation e2e flow
AustinKelsay Feb 26, 2026
3b8c825
fix: address review findings across routes, docs, and e2e
AustinKelsay Feb 26, 2026
eb65308
fix: harden credential save and auth validation flows
AustinKelsay Feb 26, 2026
a4ebdcb
chore: remove Playwright e2e suite from repo
AustinKelsay Feb 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 43 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,17 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: 1.3.3

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Type check
run: bun run tsc --noEmit

- name: Run unit tests
run: bun run test:unit

- name: Build frontend
run: bun run build

Expand Down Expand Up @@ -54,7 +57,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: 1.3.3

- name: Install dependencies
run: bun install --frozen-lockfile
Expand All @@ -71,16 +74,51 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.3

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Run security audit
run: |
bun audit || true # Don't fail on audit issues for now
audit_log="$(mktemp)"
last_exit=0
for attempt in 1 2 3; do
if bun audit >"$audit_log" 2>&1; then
cat "$audit_log"
rm -f "$audit_log"
exit 0
else
audit_exit=$?
last_exit=$audit_exit
last_attempt=$attempt
if [ "$attempt" -lt 3 ]; then
echo "bun audit failed (attempt $attempt), retrying..."
sleep 5
fi
fi
done

audit_output="$(cat "$audit_log")"
echo "bun audit failed after ${last_attempt:-3} attempts with exit code ${last_exit}"
if grep -Eiq 'network|registry|ENOTFOUND|ECONNREFUSED|EAI_AGAIN|ETIMEDOUT' <<< "$audit_output"; then
echo "bun audit failed after retries due to network/registry error: $audit_output"
else
echo "bun audit failed after retries - vulnerabilities detected: $audit_output"
fi
rm -f "$audit_log"
exit 1

- name: Check for secrets
uses: trufflesecurity/trufflehog@main
# Pinned to immutable commit (v3.93.4) for supply-chain safety.
# Maintenance: periodically verify this SHA still corresponds to the intended upstream release.
uses: trufflesecurity/trufflehog@7c0734f987ad0bb30ee8da210773b800ee2016d3
with:
path: ./
extra_args: --debug --only-verified
continue-on-error: true

Comment thread
AustinKelsay marked this conversation as resolved.
docker:
runs-on: ubuntu-latest
Expand Down
12 changes: 8 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
name: Release

on:
push:
branches: [ master ]
workflow_dispatch:
inputs:
version:
Expand Down Expand Up @@ -31,7 +29,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: 1.3.3

- name: Install dependencies
run: bun install --frozen-lockfile
Expand Down Expand Up @@ -73,6 +71,12 @@ jobs:
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
echo "version_number=${NEW_VERSION#v}" >> $GITHUB_OUTPUT

- name: Type check
run: bun run tsc --noEmit

- name: Run backend tests
run: bun run test:unit

- name: Build application
run: bun run build

Expand Down Expand Up @@ -191,7 +195,7 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: master
ref: refs/tags/${{ needs.release.outputs.new_version }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ data/.session-secret
test-*.sh
debug-*.js
verify-*.md
.DS_Store
test-results/
playwright-report/

# LLM files
.claude
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Multi-stage build for smaller production image
FROM oven/bun:latest AS build
FROM oven/bun:1.3.3 AS build

WORKDIR /app

Expand All @@ -21,7 +21,7 @@ COPY tsconfig.json ./
RUN bun run build

# --- Production stage ---
FROM oven/bun:latest AS production
FROM oven/bun:1.3.3 AS production

WORKDIR /app

Expand Down
118 changes: 58 additions & 60 deletions bun.lock

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/openapi/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ This directory contains the comprehensive OpenAPI 3.1 specification for the Iglo

## Files

- **`openapi/openapi.yaml`** - Complete OpenAPI 3.1 specification in YAML format
- **`openapi/openapi.json`** - Bundled JSON representation generated from the YAML spec
- **`docs/openapi/openapi.yaml`** - Complete OpenAPI 3.1 specification in YAML format
- **`docs/openapi/openapi.json`** - Bundled JSON representation generated from the YAML spec
- **`README.md`** - This documentation file

## Accessing the Documentation
Expand Down Expand Up @@ -102,7 +102,7 @@ This ensures the YAML syntax is correct and the specification is well-formed.

When adding or modifying API endpoints:

1. Update the corresponding section in `openapi/openapi.yaml`
1. Update the corresponding section in `docs/openapi/openapi.yaml`
2. Add/update request and response schemas
3. Include relevant examples
4. Validate the specification: `bun run docs:validate`
Expand Down
48 changes: 19 additions & 29 deletions docs/openapi/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -419,22 +419,14 @@
}
},
"400": {
"$ref": "#/components/responses/BadRequest",
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuthStatus"
"$ref": "#/components/schemas/ErrorResponse"
},
"example": {
"enabled": true,
"methods": [
"api-key",
"bearer",
"basic-auth",
"session"
],
"rateLimiting": true,
"sessionTimeout": 3600
"error": "Invalid authentication status request"
}
}
}
Expand Down Expand Up @@ -3008,14 +3000,13 @@
"methods": {
"type": "array",
"items": {
"type": "string",
"enum": [
"api-key",
"bearer",
"basic-auth",
"session"
]
},
"type": "string",
"enum": [
"api-key",
"basic-auth",
"session"
]
},
"description": "Available authentication methods"
},
"rateLimiting": {
Expand Down Expand Up @@ -3526,7 +3517,7 @@
"type": "object",
"description": "Client-supplied fields when creating or updating a NIP‑46 session",
"properties": {
"client_pubkey": {
"pubkey": {
"type": "string",
"description": "Client public key (hex encoded)"
},
Expand Down Expand Up @@ -3554,7 +3545,7 @@
}
},
"required": [
"client_pubkey"
"pubkey"
]
},
"Nip46Session": {
Expand Down Expand Up @@ -4073,13 +4064,12 @@
]
},
"example": {
"error": "Authentication required",
"authMethods": [
"api-key",
"bearer",
"basic-auth",
"session"
]
"error": "Authentication required",
"authMethods": [
"api-key",
"basic-auth",
"session"
]
}
}
}
Expand Down Expand Up @@ -4189,4 +4179,4 @@
}
}
}
}
}
19 changes: 8 additions & 11 deletions docs/openapi/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -327,16 +327,13 @@ paths:
schema:
$ref: '#/components/schemas/AuthStatus'
'400':
$ref: '#/components/responses/BadRequest'
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/AuthStatus'
$ref: '#/components/schemas/ErrorResponse'
example:
enabled: true
methods: ["api-key", "bearer", "basic-auth", "session"]
rateLimiting: true
sessionTimeout: 3600
error: "Invalid authentication status request"

/api/auth/login:
post:
Expand Down Expand Up @@ -1960,7 +1957,7 @@ components:
type: array
items:
type: string
enum: ["api-key", "bearer", "basic-auth", "session"]
enum: ["api-key", "basic-auth", "session"]
Comment thread
AustinKelsay marked this conversation as resolved.
description: Available authentication methods
rateLimiting:
type: boolean
Expand Down Expand Up @@ -2323,7 +2320,7 @@ components:
type: object
description: Client-supplied fields when creating or updating a NIP‑46 session
properties:
client_pubkey:
pubkey:
type: string
description: Client public key (hex encoded)
status:
Expand All @@ -2338,7 +2335,7 @@ components:
description: Preferred relays for the session
policy:
$ref: '#/components/schemas/Nip46Policy'
required: [client_pubkey]
required: [pubkey]

Nip46Session:
type: object
Expand Down Expand Up @@ -2631,7 +2628,7 @@ components:
type: string
example:
error: "Authentication required"
authMethods: ["api-key", "bearer", "basic-auth", "session"]
authMethods: ["api-key", "basic-auth", "session"]

InternalServerError:
description: Internal server error
Expand Down Expand Up @@ -2720,4 +2717,4 @@ tags:
- name: Onboarding
description: First-run onboarding and admin validation (database mode)
- name: Event Log
description: Persisted UI event log endpoints (database mode only)
description: Persisted UI event log endpoints (database mode only)
Loading