Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
41a4764
chore: add dependabot updates grouped per ecosystem
d3vyce Nov 12, 2026
09e2d15
chore: keep the fake test secrets out of secret scanners
d3vyce Nov 12, 2026
6c4dfff
fix: keep reviewed requests apart from waiting ones in your work
d3vyce Nov 12, 2026
97db465
docs: use conventional commit messages
d3vyce Nov 12, 2026
6e62a31
chore: pin github actions to commit shas and update them
d3vyce Nov 12, 2026
149387f
chore: publish the docker image and draft a release on version tags
d3vyce Nov 12, 2026
9a7f716
fix: open hover cards after a scroll and make two e2e tests rerunnable
d3vyce Nov 12, 2026
3617f38
ci: check pull request titles and group the release notes by type
d3vyce Nov 12, 2026
33728f3
ci: scan the code with codeql
d3vyce Nov 12, 2026
bd3788b
chore: add the script that takes the readme screenshots
d3vyce Nov 12, 2026
0ab352a
chore(deps): bump axllent/mailpit
dependabot[bot] Nov 12, 2026
551b568
chore(deps): bump the backend group with 8 updates
dependabot[bot] Nov 12, 2026
d201d01
chore(deps): bump libsqlite3-sys from 0.30.1 to 0.37.0
dependabot[bot] Nov 12, 2026
2b0a2c3
chore(deps): bump lucide-react from 0.468.0 to 1.69.0 in /web
dependabot[bot] Nov 12, 2026
af74f38
chore(deps): bump uuid from 11.1.1 to 14.0.3 in /web
dependabot[bot] Nov 12, 2026
652c8cb
chore(deps): bump base64 from 0.22.1 to 0.23.1
dependabot[bot] Nov 13, 2026
4232a4f
chore(deps): bump vite to 8 and @vitejs/plugin-react to 6
d3vyce Nov 13, 2026
68204b3
chore(deps): bump opentelemetry to 0.33 and tracing-opentelemetry to …
d3vyce Nov 13, 2026
466f6de
chore(deps): bump utoipa to 6 and openapi-typescript to 7.13
d3vyce Nov 13, 2026
9525f71
chore: group the dependabot updates that must move together
d3vyce Nov 13, 2026
cd9beb4
chore(deps): bump node to 26
d3vyce Nov 13, 2026
c96999e
chore(deps): bump aes-gcm from 0.10.3 to 0.11.1
dependabot[bot] Nov 13, 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
109 changes: 109 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
# pinned to the commit of its `1.99` branch, which picks the Rust version:
# moved by hand with the toolchain
ignore:
- dependency-name: "dtolnay/rust-toolchain"
cooldown:
default-days: 3
commit-message:
prefix: "chore"
include: "scope"
groups:
github-actions:
patterns:
- "*"
update-types:
- "minor"
- "patch"

- package-ecosystem: "cargo"
directory: "/"
schedule:
interval: "weekly"
allow:
- dependency-type: "all"
cooldown:
default-days: 3
semver-major-days: 7
commit-message:
prefix: "chore"
include: "scope"
groups:
# released together: one without the others does not build
opentelemetry:
patterns:
- "opentelemetry*"
- "tracing-opentelemetry"
backend:
patterns:
- "*"
update-types:
- "minor"
- "patch"

- package-ecosystem: "npm"
directory: "/web"
schedule:
interval: "weekly"
allow:
- dependency-type: "all"
cooldown:
default-days: 3
semver-major-days: 7
commit-message:
prefix: "chore"
include: "scope"
groups:
# @vitejs/plugin-react follows Vite's major version
vite:
patterns:
- "vite"
- "@vitejs/*"
frontend:
patterns:
- "*"
update-types:
- "minor"
- "patch"

- package-ecosystem: "docker-compose"
directory: "/"
schedule:
interval: "weekly"
cooldown:
default-days: 3
commit-message:
prefix: "chore"
include: "scope"
groups:
docker:
patterns:
- "*"
update-types:
- "minor"
- "patch"

- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
# the Rust image moves with the toolchain CI pins (dtolnay/rust-toolchain)
ignore:
- dependency-name: "rust"
cooldown:
default-days: 3
commit-message:
prefix: "chore"
include: "scope"
groups:
docker-images:
patterns:
- "*"
update-types:
- "minor"
- "patch"
37 changes: 37 additions & 0 deletions .github/release-notes.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
# Release notes from the Conventional Commit subjects between two refs, grouped by
# type, newest first. Squash merges make every pull request one such commit.
# .github/release-notes.sh v0.1.0 v0.2.0 # since v0.1.0
# .github/release-notes.sh "" HEAD # from the start
set -euo pipefail
from=${1:-}
to=${2:-HEAD}
range=${from:+$from..}$to

order=(feat fix perf docs deps internal other)
declare -A title=([feat]=Features [fix]="Bug Fixes" [perf]=Performance [docs]=Documentation
[deps]=Dependencies [internal]=Internal [other]="Other Changes")
declare -A lines=()

while IFS=$'\t' read -r sha subject; do
if [[ $subject =~ ^([a-z]+)(\(([^\)]*)\))?(!)?:\ (.+)$ ]]; then
type=${BASH_REMATCH[1]} scope=${BASH_REMATCH[3]} bang=${BASH_REMATCH[4]} text=${BASH_REMATCH[5]}
else
type=other scope="" bang="" text=$subject
fi
# the version bump itself is not news
[[ $type == chore && $text =~ ^release\ ]] && continue
case $type in
feat | fix | perf | docs) group=$type ;;
chore) [[ $scope == deps* ]] && group=deps || group=internal ;; # deps, deps-dev
refactor | test | ci | build | style) group=internal ;;
*) group=other ;;
esac
[[ -n $bang ]] && text="**breaking:** $text"
lines[$group]+="* $text ($sha)"$'\n'
done < <(git log --no-merges --format=$'%h\t%s' "$range")

for g in "${order[@]}"; do
[[ -n ${lines[$g]:-} ]] || continue
printf '### %s\n%s\n' "${title[$g]}" "${lines[$g]}"
done
4 changes: 2 additions & 2 deletions .github/workflows/bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ jobs:
env:
BASELINE: bench/baselines/bench-host.json
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- run: cargo build --release -p forgust-server -p forgust-bench
- name: Run (regression gate vs stored baseline)
run: bench/run.sh
env:
NIGHTLY: ${{ github.event_name == 'schedule' }}
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: bench-results
path: bench/results/
48 changes: 24 additions & 24 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.99
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@d124f86f28ff42855784ff3319f48ac182c248f8 # 1.99
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2.9.3
- name: Format
run: cargo fmt --all --check
- name: Clippy
Expand Down Expand Up @@ -81,16 +81,16 @@ jobs:
FORGUST_TEST_PG_RESTORE: /usr/lib/postgresql/17/bin/pg_restore
FORGUST_TEST_PG_URL: postgres://forgust:forgust@127.0.0.1:5432
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: System packages (git-lfs, the Postgres 17 client for the backup test)
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends git-lfs openssh-client postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
sudo apt-get install -y --no-install-recommends postgresql-client-17
git --version && git lfs version && /usr/lib/postgresql/17/bin/pg_dump --version
- uses: dtolnay/rust-toolchain@1.99
- uses: Swatinem/rust-cache@v2
- uses: dtolnay/rust-toolchain@d124f86f28ff42855784ff3319f48ac182c248f8 # 1.99
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2.9.3
with:
shared-key: test
save-if: ${{ matrix.shard == 1 }}
Expand Down Expand Up @@ -128,9 +128,9 @@ jobs:
DATABASE_URL: postgres://forgust:forgust@127.0.0.1:5432/forgust
FORGUST_TEST_RUNNER: gitlab/gitlab-runner:${{ matrix.runner }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.99
- uses: Swatinem/rust-cache@v2
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@d124f86f28ff42855784ff3319f48ac182c248f8 # 1.99
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2.9.3
- name: Images
run: |
pull() { for i in 1 2 3 4; do docker pull -q "$1" && return; sleep 15; done; return 1; }
Expand Down Expand Up @@ -159,9 +159,9 @@ jobs:
FORGUST_TEST_SKOPEO: quay.io/skopeo/stable:v1.22.3
GLAB_VERSION: "1.128.0"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.99
- uses: Swatinem/rust-cache@v2
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@d124f86f28ff42855784ff3319f48ac182c248f8 # 1.99
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2.9.3
- name: glab, Renovate and skopeo
run: |
curl -sSfL "https://gitlab.com/gitlab-org/cli/-/releases/v${GLAB_VERSION}/downloads/glab_${GLAB_VERSION}_linux_amd64.tar.gz" \
Expand Down Expand Up @@ -189,8 +189,8 @@ jobs:
env:
CARGO_DENY: "0.20.2"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.99
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@d124f86f28ff42855784ff3319f48ac182c248f8 # 1.99
- name: cargo-deny
run: |
curl -sSfL "https://github.com/EmbarkStudios/cargo-deny/releases/download/${CARGO_DENY}/cargo-deny-${CARGO_DENY}-x86_64-unknown-linux-musl.tar.gz" \
Expand All @@ -204,10 +204,10 @@ jobs:
run:
working-directory: web
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 22
node-version: 26
cache: npm
cache-dependency-path: web/package-lock.json
- run: npm ci
Expand All @@ -221,7 +221,7 @@ jobs:
if: github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Build the image
run: docker build -t "forgust:ci-${GITHUB_RUN_NUMBER}" .
- name: The image starts
Expand All @@ -248,12 +248,12 @@ jobs:
FORGUST_SERVER__DATA_DIR: /tmp/forgust-e2e
FORGUST_SERVER__STATIC_DIR: web/dist
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.99
- uses: Swatinem/rust-cache@v2
- uses: actions/setup-node@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@d124f86f28ff42855784ff3319f48ac182c248f8 # 1.99
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2.9.3
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 22
node-version: 26
cache: npm
cache-dependency-path: web/package-lock.json
- name: Build
Expand All @@ -278,7 +278,7 @@ jobs:
- name: Server log
if: failure()
run: tail -200 /tmp/forgust-e2e.log
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
if: failure()
continue-on-error: true
with:
Expand Down
43 changes: 43 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: CodeQL

# Code scanning for the server (Rust), the web UI (TypeScript) and these
# workflows; findings show in the repository's Security tab.
on:
push:
branches: [main]
pull_request:
# nothing to scan in prose or screenshots; main and the weekly run see everything
paths-ignore: ["**/*.md", ".github/images/**"]
schedule:
- cron: "41 4 * * 1"

permissions:
contents: read

concurrency:
group: codeql-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
analyze:
name: analyze (${{ matrix.language }})
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [rust, javascript-typescript, actions]
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- uses: github/codeql-action/init@33d7b85da1a04171e211befe2c739303b9a4c066 # v4.39.3
with:
languages: ${{ matrix.language }}
build-mode: none
queries: security-extended

- uses: github/codeql-action/analyze@33d7b85da1a04171e211befe2c739303b9a4c066 # v4.39.3
with:
category: /language:${{ matrix.language }}
2 changes: 1 addition & 1 deletion .github/workflows/conformance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
env:
GITLAB_CT: forgust-conformance-${{ github.run_id }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Start GitLab CE
run: |
docker run -d --name "$GITLAB_CT" -p 8929:8929 --shm-size 256m \
Expand Down
33 changes: 33 additions & 0 deletions .github/workflows/pr-title.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Pull request title

# Squash merges use the pull request's title as the commit message on main, and
# the release notes are grouped by its type: it must be a Conventional Commit.
on:
pull_request:
types: [opened, edited, synchronize, reopened]

permissions:
pull-requests: read

jobs:
conventional:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@2252a14e810aa9b85c2d560bd7070c802206ecf6 # v6.1.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
feat
fix
perf
refactor
docs
test
ci
chore
revert
subjectPattern: ^(?![A-Z]).+$
subjectPatternError: |
The summary "{subject}" starts with a capital letter: write it in lower case,
for example "fix: keep reviewed requests apart in your work".
Loading
Loading