Skip to content
Merged

Dev #35

Show file tree
Hide file tree
Changes from 63 commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
f09f9f9
first round performance review improvements for headless mode
AustinKelsay Jan 7, 2026
04765b6
optimize headless mode startup and memory usage
AustinKelsay Jan 7, 2026
f95f705
type fixes
AustinKelsay Jan 7, 2026
22d516a
type fix
AustinKelsay Jan 7, 2026
ef595c2
Merge pull request #34 from FROSTR-ORG/refactor/headless-performance-…
AustinKelsay Jan 7, 2026
83f6a8e
update available banner
AustinKelsay Feb 4, 2026
3804a90
fix type
AustinKelsay Feb 4, 2026
b5700aa
fix import
AustinKelsay Feb 4, 2026
1c00472
Merge pull request #36 from FROSTR-ORG/feature/update-available
AustinKelsay Feb 4, 2026
a64e349
documentation updateds and polish
AustinKelsay Feb 5, 2026
d2dd113
docs updates and polish
AustinKelsay Feb 9, 2026
8f33c2c
nitpicks
AustinKelsay Feb 9, 2026
cd9c132
Merge pull request #37 from FROSTR-ORG/chore/documentation-updates-0
AustinKelsay Feb 9, 2026
59e3a7d
persist UI event logs to sqlite with pagination, lazy-load blobs, a…
AustinKelsay Feb 9, 2026
aaf2208
type fix
AustinKelsay Feb 9, 2026
e616e05
harden log-entry logic
AustinKelsay Feb 9, 2026
b020927
type fix
AustinKelsay Feb 9, 2026
2aec5b1
fix event log counter
AustinKelsay Feb 9, 2026
69ed0c6
Merge pull request #38 from FROSTR-ORG/refactor/cleaner-logs
AustinKelsay Feb 10, 2026
595d2c0
address code rabbit comments
AustinKelsay Feb 10, 2026
954d76c
extracted loadInitialHistory as a reusable callback, and handleClearL…
AustinKelsay Feb 10, 2026
4f38817
remove any types from event log persist chain, fix stale version in …
AustinKelsay Feb 10, 2026
db0511f
log storage optimizations and options
AustinKelsay Feb 10, 2026
699d256
fix type
AustinKelsay Feb 13, 2026
327e999
Merge pull request #40 from FROSTR-ORG/feature/ui-event-log-storage-o…
AustinKelsay Feb 13, 2026
9c9405a
add alert on log export failure
AustinKelsay Feb 13, 2026
6628c9d
Merge pull request #41 from FROSTR-ORG/feature/ui-event-log-storage-o…
AustinKelsay Feb 13, 2026
12698ac
docs: add event-log endpoints to API reference
AustinKelsay Feb 13, 2026
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
f78ab77
fix: bump minimatch override past audit vulnerability
AustinKelsay Feb 26, 2026
27a8e24
fix: apply pending auth env hardening updates
AustinKelsay Feb 26, 2026
f8a9519
fix: bump fast-xml-parser override for security audit
AustinKelsay Feb 26, 2026
f23128a
fix: avoid ui-event-log test crash after db cleanup
AustinKelsay Feb 26, 2026
98a0d63
fix: address review findings across routes, ui, and workflows
AustinKelsay Feb 27, 2026
269376f
fix: apply requested API and UI hardening updates
AustinKelsay Feb 28, 2026
f3a834d
fix: resolve auth and nip44 type regressions
AustinKelsay Mar 5, 2026
3018393
fix: restore protected route compatibility
AustinKelsay Mar 5, 2026
4592326
fix: override vulnerable dompurify
AustinKelsay Mar 5, 2026
2daa6d2
fix: address auth hardening review findings
AustinKelsay Mar 5, 2026
f8a8e73
Merge pull request #44 from FROSTR-ORG/feature/auth-env-hardening
AustinKelsay Mar 5, 2026
4fd8dd0
fix: address latest coderabbit review findings
AustinKelsay Mar 6, 2026
3201d6a
fix: address follow-up coderabbit findings
AustinKelsay Mar 6, 2026
ada5296
fix: address latest nip46 review findings
AustinKelsay Mar 7, 2026
48da57c
fix: harden release metadata and runtime contracts
AustinKelsay Mar 9, 2026
d2db2e9
chore: suppress stale browserslist build warning
AustinKelsay Mar 9, 2026
5e91d69
chore: add mission scaffolding for nip44 release rollout
AustinKelsay May 28, 2026
fede229
chore: add validation-readiness scrutiny synthesis and review
AustinKelsay May 28, 2026
e01e36d
chore: add user-testing validation synthesis for validation-readiness…
AustinKelsay May 28, 2026
dd240ba
fix(nip44): derive standards-compliant conversation key via HKDF on /…
AustinKelsay May 28, 2026
4478f2b
chore: note scanner-safe crypto variable names
AustinKelsay May 28, 2026
977b900
chore: scrutiny synthesis for nip44-api-fix milestone
AustinKelsay May 28, 2026
b8ee347
chore: user-testing validation synthesis for nip44-api-fix milestone
AustinKelsay May 28, 2026
8435004
fix(nip46): derive standards-compliant NIP-44 conversation key on nip…
AustinKelsay May 28, 2026
1f91f50
chore: scrutiny synthesis for nip46-fix-and-polish milestone
AustinKelsay May 28, 2026
918cfa3
chore: user-testing validation synthesis for nip46-fix-and-polish mil…
AustinKelsay May 28, 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
64 changes: 51 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: CI

on:
push:
branches: [ master, dev ]
branches: [ main, dev ]
pull_request:
branches: [ master, dev ]
branches: [ main, dev ]
Comment thread
AustinKelsay marked this conversation as resolved.
Outdated

jobs:
test:
Expand All @@ -17,14 +17,17 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: 1.3.10

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

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

- name: Run test suite
run: bun test

- 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.10

- 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.10

- 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

docker:
runs-on: ubuntu-latest
Expand All @@ -104,13 +142,13 @@ jobs:

- name: Test Docker image
run: |
set -euo pipefail
trap 'docker stop test-container >/dev/null 2>&1 || true; docker rm test-container >/dev/null 2>&1 || true' EXIT
docker run -d --name test-container -p 8002:8002 \
-e AUTO_ADMIN_SECRET=true \
igloo-server:test
sleep 10
curl -f http://localhost:8002/api/status || exit 1
docker stop test-container
docker rm test-container
curl -f http://localhost:8002/api/status

- name: Build Umbrel Docker image
uses: docker/build-push-action@v5
Expand All @@ -124,12 +162,12 @@ jobs:

- name: Test Umbrel Docker image
run: |
set -euo pipefail
trap 'docker stop test-umbrel >/dev/null 2>&1 || true; docker rm test-umbrel >/dev/null 2>&1 || true' EXIT
docker run -d --name test-umbrel -p 8003:8002 \
-e ADMIN_SECRET=ci-admin-secret \
-e ALLOWED_ORIGINS=http://localhost:8003 \
-e TRUST_PROXY=true \
igloo-server-umbrel:test
sleep 10
curl -f http://localhost:8003/api/status || exit 1
docker stop test-umbrel
docker rm test-umbrel
curl -f http://localhost:8003/api/status
124 changes: 73 additions & 51 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:
Comment on lines 3 to 7

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

git ls-files ".github/workflows/*.yml"

Repository: FROSTR-ORG/igloo-server

Length of output: 154


🏁 Script executed:

cat -n ".github/workflows/release.yml"

Repository: FROSTR-ORG/igloo-server

Length of output: 7399


Don't trigger release workflow on every push to master without versioning changes.

Every push to master will execute the release job. When package.json hasn't changed, the version is reused from the previous release. At lines 89–90, tag creation is skipped if the tag already exists, but the job continues executing: it builds artifacts, and at lines 96–127 the release action creates or updates a release for that existing tag. This means multiple commits can publish under the same version tag—each overwriting the previous release's artifacts—making it impossible to track which commit corresponds to a released version.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release.yml around lines 3 - 7, The workflow currently
triggers on every push to master (the on: push branches: - master block) which
allows the tag-creation and release-action steps to overwrite an existing
release; change the trigger to only run when package.json (or other versioned
files) change (e.g., on: push paths: [package.json] for master) OR add an early
job step that checks diff of package.json between HEAD and previous commit
(using actions/checkout + git diff HEAD^..HEAD -- package.json) and exits the
job if there is no change; ensure this check runs before the existing tag
creation step and before the release action so builds and releases are skipped
for commits that don’t change the version.

inputs:
version:
Expand All @@ -13,7 +11,7 @@ on:
jobs:
release:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master' && github.event_name == 'workflow_dispatch'
if: github.ref == 'refs/heads/main' && github.event_name == 'workflow_dispatch'
Comment thread
AustinKelsay marked this conversation as resolved.
Outdated
permissions:
contents: write
pull-requests: write
Expand All @@ -31,7 +29,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: 1.3.10

- 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 test suite
run: bun test

- name: Build application
run: bun run build

Expand All @@ -83,25 +87,56 @@ jobs:
echo "# CHANGELOG" > CHANGELOG.md
echo "" >> CHANGELOG.md
fi
# Add new version entry

VERSION="${{ steps.new_version.outputs.version_number }}"
DATE=$(date +%Y-%m-%d)
sed -i "3i\\## [${{ steps.new_version.outputs.version_number }}] - $DATE\\n" CHANGELOG.md

# Add commit messages since last tag
if ! grep -Fq "## [${VERSION}]" CHANGELOG.md; then
awk -v version="$VERSION" -v date="$DATE" '
NR == 1 { print; print ""; print "## [" version "] - " date; print ""; next }
{ print }
' CHANGELOG.md > CHANGELOG.md.tmp
mv CHANGELOG.md.tmp CHANGELOG.md
fi

temp_changelog="$(mktemp)"

# Add commit messages since last tag (safe for special chars in subjects)
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -n "$LAST_TAG" ]; then
echo "### Changes since $LAST_TAG:" >> temp_changelog.md
git log --pretty=format:"- %s" $LAST_TAG..HEAD >> temp_changelog.md
printf '### Changes since %s:\n' "$LAST_TAG" > "$temp_changelog"
git log --pretty=format:'%s%x00' "$LAST_TAG..HEAD" \
| tr '\0' '\n' \
| awk 'NF { print "- " $0 }' >> "$temp_changelog"
else
echo "### Changes:" >> temp_changelog.md
git log --pretty=format:"- %s" -n 10 >> temp_changelog.md
printf '### Changes:\n' > "$temp_changelog"
git log --pretty=format:'%s%x00' -n 10 \
| tr '\0' '\n' \
| awk 'NF { print "- " $0 }' >> "$temp_changelog"
fi
printf '\n' >> "$temp_changelog"

# Insert changes into changelog after the current version heading
awk -v target="## [${VERSION}]" -v insert_file="$temp_changelog" '
{ print }
$0 == target && !inserted {
while ((getline line < insert_file) > 0) print line
close(insert_file)
Comment thread
AustinKelsay marked this conversation as resolved.
Outdated
inserted = 1
}
' CHANGELOG.md > CHANGELOG.md.tmp
mv CHANGELOG.md.tmp CHANGELOG.md
rm -f "$temp_changelog"

- name: Commit release metadata
run: |
TAG="${{ steps.new_version.outputs.new_version }}"
git add package.json bun.lock CHANGELOG.md
if git diff --cached --quiet; then
echo "No release metadata changes to commit"
else
git commit -m "chore(release): ${TAG}"
git push origin HEAD:${GITHUB_REF_NAME}
fi
echo "" >> temp_changelog.md

# Insert changes into changelog
sed -i "/## \[${{ steps.new_version.outputs.version_number }}\]/r temp_changelog.md" CHANGELOG.md
rm temp_changelog.md

- name: Create release archive
run: |
Expand All @@ -122,28 +157,30 @@ jobs:
--exclude=.git \
--exclude=release \
--exclude=frontend \
src static package.json bun.lock tsconfig.json dockerfile compose.yml README.md LICENSE
src static package.json bun.lock tsconfig.json Dockerfile compose.yml README.md LICENSE

- name: Create release tag
run: |
# Create git tag for release (works with branch protection)
# Note: Version changes are not committed back to master due to branch protection
# The release archives will contain the correct versions
git tag ${{ steps.new_version.outputs.new_version }}
git push origin ${{ steps.new_version.outputs.new_version }}

- name: Create GitHub Release
uses: actions/create-release@v1
id: create_release
TAG="${{ steps.new_version.outputs.new_version }}"
git fetch --tags origin
if git rev-parse -q --verify "refs/tags/${TAG}" >/dev/null; then
echo "Tag ${TAG} already exists, skipping tag creation"
else
git tag "${TAG}"
git push origin "${TAG}"
fi
Comment thread
AustinKelsay marked this conversation as resolved.

- name: Create GitHub release and upload assets
uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.new_version.outputs.new_version }}
release_name: Release ${{ steps.new_version.outputs.new_version }}
name: Release ${{ steps.new_version.outputs.new_version }}
body: |
## Changes in ${{ steps.new_version.outputs.new_version }}

See [CHANGELOG.md](https://github.com/FROSTR-ORG/igloo-server/blob/master/CHANGELOG.md) for full details.
See [CHANGELOG.md](https://github.com/FROSTR-ORG/igloo-server/blob/main/CHANGELOG.md) for full details.

### Installation

Expand All @@ -162,36 +199,21 @@ jobs:
```
draft: false
prerelease: false

- name: Upload source archive
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./release/igloo-server-${{ steps.new_version.outputs.version_number }}-src.tar.gz
asset_name: igloo-server-${{ steps.new_version.outputs.version_number }}-src.tar.gz
asset_content_type: application/gzip

- name: Upload binary archive
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./release/igloo-server-${{ steps.new_version.outputs.version_number }}.tar.gz
asset_name: igloo-server-${{ steps.new_version.outputs.version_number }}.tar.gz
asset_content_type: application/gzip
files: |
./release/igloo-server-${{ steps.new_version.outputs.version_number }}-src.tar.gz
./release/igloo-server-${{ steps.new_version.outputs.version_number }}.tar.gz

docker:
runs-on: ubuntu-latest
needs: release
permissions:
packages: write

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: master
ref: refs/tags/${{ needs.release.outputs.new_version }}
Comment on lines +132 to +139

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n .github/workflows/release.yml | head -160 | tail -50

Repository: FROSTR-ORG/igloo-server

Length of output: 1977


🏁 Script executed:

# Get the full context of the docker job
sed -n '100,150p' .github/workflows/release.yml

Repository: FROSTR-ORG/igloo-server

Length of output: 1682


🏁 Script executed:

# Check if there are any other permission patterns in the file
grep -n "permissions:" .github/workflows/release.yml -A 3

Repository: FROSTR-ORG/igloo-server

Length of output: 227


🌐 Web query:

actions/checkout v4 permissions contents:read required github actions

💡 Result:

actions/checkout@v4 needs the workflow job’s GITHUB_TOKEN to be able to read repository contents. If you’ve locked down token permissions (for least privilege), you must grant at least:

permissions:
  contents: read

Otherwise the checkout step can fail because any permission you don’t list is set to none. (github.com)

Notes:

  • contents: read is sufficient for “clone/build/test” workflows. (github.com)
  • If you plan to push commits/tags, you’ll need contents: write (and possibly additional scopes depending on what you do). (github.blog)

Citations:


🏁 Script executed:

# Check if there are any comments or documentation in the workflow file itself
grep -i "permission\|token\|contents\|read" .github/workflows/release.yml | head -20

Repository: FROSTR-ORG/igloo-server

Length of output: 438


Restore repository read permission in the Docker job.

Job-level permissions replace the defaults. With only packages: write here, actions/checkout@v4 cannot fetch the tag reference refs/tags/${{ needs.release.outputs.new_version }}. Add contents: read to enable the checkout step.

🔧 Minimal fix
   docker:
     runs-on: ubuntu-latest
     needs: release
     permissions:
+      contents: read
       packages: write
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release.yml around lines 132 - 139, The Docker job's
job-level permissions only specify "packages: write", which prevents
actions/checkout@v4 from fetching the tag at ref: refs/tags/${{
needs.release.outputs.new_version }}; update the job's permissions block (the
permissions: entry) to include contents: read alongside packages: write so
actions/checkout@v4 can read the repository contents and checkout the tag.


- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/umbrel-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Umbrel Dev Image
on:
push:
branches:
- master
- main
Comment thread
AustinKelsay marked this conversation as resolved.
Outdated
- dev
workflow_dispatch:

Expand Down Expand Up @@ -39,11 +39,16 @@ jobs:

- name: Smoke test Umbrel image
run: |
set -e
cleanup() {
docker rm -f umbrel-dev-test >/dev/null 2>&1 || true
}
trap cleanup EXIT

docker run -d --name umbrel-dev-test -p 8003:8002 \
-e ADMIN_SECRET=ci-admin-secret \
-e ALLOWED_ORIGINS=http://localhost:8003 \
-e TRUST_PROXY=true \
igloo-server-umbrel:dev-ci
sleep 12
curl -f http://localhost:8003/api/status
docker rm -f umbrel-dev-test
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ dist
static/app.js
static/app.css
static/styles.css
static/docs/swagger-ui-bundle.js
static/docs/swagger-ui-bundle.js.map
static/qr-scanner-worker.min.js

# VSCode
Expand All @@ -64,7 +66,7 @@ data/.session-secret
test-*.sh
debug-*.js
verify-*.md
.DS_Store
test-results/

# LLM files
.claude
5 changes: 2 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ This guide keeps backend, frontend, and deployment workflows consistent for this
- Co‑locate tests with code as `feature.test.ts` or `feature.spec.ts`.

## Build, Test, and Development Commands
- `bun run dev` — run backend, React, and Tailwind in watch mode.
- `bun run dev` — watch/rebuild frontend assets (Tailwind CSS + esbuild JS bundle).
- `bun run build` — create production bundles.
- `bun run build:dev` — readable bundles for debugging.
- `bun run start` — start packaged server; use `HEADLESS=true bun run start` to skip UI assets.
- `bun run start` — start the server (use a separate terminal alongside `bun run dev` during development); use `HEADLESS=true bun run start` to skip UI assets.
- `bun test` — run backend tests.
- `bun run docs:validate` — validate the OpenAPI contract.

Expand All @@ -40,4 +40,3 @@ This guide keeps backend, frontend, and deployment workflows consistent for this
- Load secrets from environment files or `data/` fixtures; never hard‑code.
- Production: set `AUTH_ENABLED=true`, strong `ADMIN_SECRET`, and run behind TLS on `0.0.0.0`.
- Tune `FROSTR_SIGN_TIMEOUT`, `SIGN_TIMEOUT_MS`, `AUTH_DERIVED_KEY_TTL_MS`, and `AUTH_DERIVED_KEY_MAX_READS` per environment.

Loading