Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
ddff4fe
Update node dependencies to latest
ShahanaFarooqui Sep 15, 2026
63042c0
Require session and current password to reset an existing password
ShahanaFarooqui Sep 15, 2026
165c5b7
Centralise session token creation
ShahanaFarooqui Sep 16, 2026
06758f9
Share cookie attributes across session and CSRF cookies
ShahanaFarooqui Sep 16, 2026
c72a7e7
Trim backend logging to summaries
ShahanaFarooqui Sep 16, 2026
5677418
Hash stored password with scrypt and throttle auth attempts
ShahanaFarooqui Sep 16, 2026
97e4ceb
Restrict forwarded lightning methods to those the UI uses
ShahanaFarooqui Sep 15, 2026
bb4f98c
Verify the wss proxy certificate against the node CA
ShahanaFarooqui Sep 16, 2026
2fe7ace
Replace csurf with csrf-csrf
ShahanaFarooqui Sep 16, 2026
48ca7fb
Set response security headers with helmet
ShahanaFarooqui Sep 16, 2026
fae2a46
Make the Express trust proxy setting configurable
ShahanaFarooqui Sep 16, 2026
0aff6df
Validate application settings before saving them
ShahanaFarooqui Sep 16, 2026
a6d4786
Serve fiat rates only to signed-in users and cache them
ShahanaFarooqui Sep 16, 2026
0d4e488
Add optional native HTTPS and document transport expectations
ShahanaFarooqui Sep 16, 2026
bff9a98
Keep rune values out of entrypoint output
ShahanaFarooqui Sep 16, 2026
5de83db
Explain the single sign-on mode in the README
ShahanaFarooqui Sep 16, 2026
6c72e10
Normalise error responses
ShahanaFarooqui Sep 17, 2026
54613c4
Use the ws client for commando and reconnect on demand
ShahanaFarooqui Sep 17, 2026
f36b6c4
Update node to v22 in Docker container
ShahanaFarooqui Sep 17, 2026
59a904b
Update GitHub Actions workflows to run on Node 22 and ubuntu-24.04
ShahanaFarooqui Sep 17, 2026
cc38366
Do not create a second Invoice rune if it already exists
ShahanaFarooqui Sep 17, 2026
a0a668f
Load gRPC protocol definitions from the repository
ShahanaFarooqui Sep 17, 2026
3d83857
Only log the route and reason for failed requests
ShahanaFarooqui Sep 17, 2026
5e12aa2
Revoke sessions on logout and password change
ShahanaFarooqui Sep 17, 2026
a7e5c73
Build the frontend without source maps in the image
ShahanaFarooqui Sep 17, 2026
ab643e4
Fix tests by upgrading version
ShahanaFarooqui Sep 17, 2026
8ac0208
Require a minimum length for new passwords
ShahanaFarooqui Sep 18, 2026
7f48e96
Open external links without an opener reference
ShahanaFarooqui Sep 18, 2026
3c0c111
Pin build inputs and add dependency update configuration
ShahanaFarooqui Sep 18, 2026
d8fd2f7
Log the single sign-on state at startup
ShahanaFarooqui Sep 18, 2026
267166d
Drop the unused ts-node dependency from the backend
ShahanaFarooqui Sep 19, 2026
0cef450
Send logout as a POST request
ShahanaFarooqui Sep 18, 2026
ed10f5e
Build the frontend without an inline runtime chunk
ShahanaFarooqui Sep 19, 2026
0d1fae4
Stop waiting for lightningd after a fixed number of attempts
ShahanaFarooqui Sep 19, 2026
c166dc9
Add backend unit tests for authentication, validation and CSRF
ShahanaFarooqui Sep 19, 2026
3ff4ff1
Migrate app build off react-scripts
ShahanaFarooqui Sep 21, 2026
d84af7e
Show the session-check error in the login dialog instead of implying …
ShahanaFarooqui Sep 22, 2026
aec8c3f
Show max amount into millions not thousands
ShahanaFarooqui Sep 22, 2026
dd6fcba
Check the fetched invoice amount against the requested amount before …
ShahanaFarooqui Sep 22, 2026
9464a84
Create the invoice rune as one restriction with both methods as alter…
ShahanaFarooqui Sep 22, 2026
060a11c
Keep API responses out of the browser cache
ShahanaFarooqui Sep 22, 2026
5d8d8b5
Copy the lockfile into the runtime image instead of a second package.…
ShahanaFarooqui Sep 22, 2026
570f376
Parse JSON request bodies only
ShahanaFarooqui Sep 22, 2026
7d71106
Wait for the logout request to finish before clearing the session view
ShahanaFarooqui Sep 22, 2026
773cf2d
Accept the first password only from the server's own address
ShahanaFarooqui Sep 23, 2026
676e91a
Require the confirmation password to be typed rather than pasted
ShahanaFarooqui Sep 23, 2026
1d7640f
Add SECURITY.md and the release signing keys under contrib/keys
ShahanaFarooqui Sep 24, 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
21 changes: 21 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Build context for the Dockerfile: only sources are needed
.git
.github
.claude
.vscode
node_modules
apps/*/node_modules
apps/frontend/build
apps/backend/dist
data
release
*.log
.commando
.commando-env
.env
env.sh
env-local.sh
docker-compose.yml
Dockerfile
README.md
LICENSE
15 changes: 15 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 5
- package-ecosystem: docker
directory: /
schedule:
interval: weekly
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
2 changes: 1 addition & 1 deletion .github/docs/Contributing.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Development Setup
------------------
### Prerequisites
- Node.js (v14 or higher)
- Node.js (v20.19 or higher, or v22.12 or higher)
- npm
- Running instances of bitcoind and core-lightning

Expand Down
4 changes: 3 additions & 1 deletion .github/docs/Dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ node's full state at a glance:
- **Total Balance** — combined on-chain + Lightning funds.
- The summary strip beside it shows **Active Channels**, connected **Peers**,
and **Maximum Send / Maximum Receive** — the node's total outbound and
inbound Lightning capacity.
inbound Lightning capacity. In sats mode these two values are shown in full
up to 999,999 sats and in millions above that (for example `1.5M`, `74.89M`);
hover over a value to see its fiat equivalent.

## Bitcoin Wallet card

Expand Down
31 changes: 10 additions & 21 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,21 @@ name: Build
on:
pull_request:
workflow_dispatch:


permissions:
contents: read

jobs:
build:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- name: Checkout source code
uses: actions/checkout@v3
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 18.x
node-version: 22.x

- name: Get version from package.json
id: package-version
Expand All @@ -23,32 +26,18 @@ jobs:
echo "Project Version: $VERSION"

- name: Cache node_modules
uses: actions/cache@v3
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
id: cache-npm-packages
with:
path: node_modules
key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }}
key: ${{ runner.os }}-node22-${{ hashFiles('**/package-lock.json') }}

- name: Install NPM dependencies
if: steps.cache-npm-packages.outputs.cache-hit != 'true'
run: npm clean-install

- name: Cache build frontend
uses: actions/cache@v3
id: cache-build-frontend
with:
path: apps/frontend
key: ${{ runner.os }}-frontend-${{ github.sha }}

- name: Run build production application
run: npm run frontend:build

- name: Cache build backend
uses: actions/cache@v3
id: cache-build-backend
with:
path: apps/backend
key: ${{ runner.os }}-backend-${{ github.sha }}

- name: Run build backend server
run: npm run backend:build
58 changes: 31 additions & 27 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,37 @@ on:
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
eslint:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v3

- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 18.x

- name: Get version from package.json
id: package-version
run: |
echo "VERSION=$(node -p "require('./package.json').version")" >> $GITHUB_ENV
echo "Project Version: $VERSION"

- name: Cache node_modules
uses: actions/cache@v3
id: cache-npm-packages
with:
path: node_modules
key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }}

- name: Install NPM dependencies
if: steps.cache-npm-packages.outputs.cache-hit != 'true'
run: npm clean-install

- name: Check lint errors
run: npm run lint
- name: Checkout source code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22.x

- name: Get version from package.json
id: package-version
run: |
echo "VERSION=$(node -p "require('./package.json').version")" >> $GITHUB_ENV
echo "Project Version: $VERSION"

- name: Cache node_modules
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
id: cache-npm-packages
with:
path: node_modules
key: ${{ runner.os }}-node22-${{ hashFiles('**/package-lock.json') }}

- name: Install NPM dependencies
if: steps.cache-npm-packages.outputs.cache-hit != 'true'
run: npm clean-install

- name: Check lint errors
run: npm run lint
19 changes: 12 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ on:
release:
types: [released]
workflow_dispatch:


permissions:
contents: read
packages: write

jobs:
build:
name: Build image
Expand All @@ -15,19 +19,19 @@ jobs:
run: |
echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
echo "IMAGE_NAME=$(echo $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV

- name: Login to GitHub Container Registry
uses: docker/login-action@v3
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Checkout project
uses: actions/checkout@v6
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup Node
uses: actions/setup-node@v5
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22.x

Expand All @@ -40,16 +44,17 @@ jobs:
echo "Project Version: $VERSION"

- name: Set up QEMU
uses: docker/setup-qemu-action@v4
uses: docker/setup-qemu-action@99012661954931238ded8c8b007157a8430204e1 # v4.4.0
id: qemu

- name: Setup Docker buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
id: buildx

- name: Run Docker buildx
run: |
docker buildx build \
--platform linux/amd64,linux/arm64,linux/arm/v7 \
--tag ghcr.io/$IMAGE_NAME:$VERSION \
--provenance=true --sbom=true \
--output "type=registry" .
46 changes: 46 additions & 0 deletions .github/workflows/security.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Security checks

on:
pull_request:
workflow_dispatch:
schedule:
- cron: '17 6 * * 1'

permissions:
contents: read

jobs:
audit:
name: Runtime dependency audit
runs-on: ubuntu-24.04
steps:
- name: Checkout source code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22.x

- name: Audit runtime dependencies
run: npm audit --omit=dev --audit-level=high

secrets:
name: Secret scan
runs-on: ubuntu-24.04
steps:
- name: Checkout source code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0

- name: Scan commits for secrets
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
RANGE="${{ github.event.pull_request.base.sha }}..${{ github.sha }}"
else
RANGE="HEAD~20..HEAD"
fi
docker run --rm -v "$PWD:/repo" -w /repo \
ghcr.io/gitleaks/gitleaks:v8.30.1@sha256:c00b6bd0aeb3071cbcb79009cb16a60dd9e0a7c60e2be9ab65d25e6bc8abbb7f \
git --log-opts="$RANGE" --redact --no-banner --verbose
19 changes: 12 additions & 7 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,21 @@ name: Unit tests
on:
pull_request:
workflow_dispatch:


permissions:
contents: read

jobs:
test:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- name: Checkout source code
uses: actions/checkout@v3
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 18.x
node-version: 22.x

- name: Get version from package.json
id: package-version
Expand All @@ -23,11 +26,11 @@ jobs:
echo "Project Version: $VERSION"

- name: Cache node_modules
uses: actions/cache@v3
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
id: cache-npm-packages
with:
path: node_modules
key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }}
key: ${{ runner.os }}-node22-${{ hashFiles('**/package-lock.json') }}

- name: Install NPM dependencies
if: steps.cache-npm-packages.outputs.cache-hit != 'true'
Expand All @@ -36,3 +39,5 @@ jobs:
- name: Run frontend unit tests
run: npm run frontend:test

- name: Run backend unit tests
run: npm run backend:test
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.claude
.vscode
node_modules
data
Expand All @@ -8,3 +9,4 @@ release
env-local.sh
apps/frontend/build
apps/backend/dist
.env
Loading