Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
d1aa403
ci: add alpine dockerfile
rare-magma Jun 2, 2024
611c1a1
feat: handle alpine configuration
rare-magma Jun 2, 2024
348494d
ci: build alpine docker image
rare-magma Jun 2, 2024
5d0cd7e
ci: remove unused env var
rare-magma Jun 2, 2024
4f067f4
fix: purge build dependencies
rare-magma Jun 2, 2024
301e3f5
fix: purge php src
rare-magma Jun 2, 2024
420be5e
Release 5.4 (#645)
sstidl Aug 4, 2024
d693074
fix: mysqlsetting were used for mssql
sstidl Aug 10, 2024
7327d2f
Merge pull request #648 from librespeed/633-invalid-username-password…
sstidl Aug 10, 2024
3ae0e9e
Bumped version to 5.4.1
adolfintel Aug 10, 2024
e488bc4
ci: fix tags
rare-magma Aug 10, 2024
c73ed71
ci: add missing tag
rare-magma Aug 10, 2024
09d07a1
ci: add missing tag for pr and branch
rare-magma Aug 10, 2024
2c39a3a
ci: add missing flavour for pr and branch
rare-magma Aug 10, 2024
0e4c1e2
ci: add missing flavour for version
rare-magma Aug 10, 2024
76bb7de
ci: bump php in docker
rare-magma Aug 13, 2024
79436f0
Merge pull request #631 from rare-magma/add-alpine-docker-image
sstidl Aug 14, 2024
33390e9
docs: add alpine info (#654)
rare-magma Aug 14, 2024
c9fdd2f
Update getIP.php return the ability to do online check for IP locatio…
IRainman Aug 16, 2024
2b53bba
Changed var to the let/const because it's completely supported by IE1…
IRainman Aug 16, 2024
4b83718
Added a modern design example
bogdanr Sep 24, 2024
89c8e2f
Updated ipinfo offline db
adolfintel Sep 26, 2024
748625a
Update index.html
BYT-Bender Oct 9, 2024
635ac50
add MariaDB to README.md (#673)
robertsilen Oct 9, 2024
0c31f1d
alpine/debian images tested with postgres
sstidl Oct 26, 2024
2c3be7b
docker test for postgres
sstidl Oct 26, 2024
8a7c145
test docker mysql
sstidl Oct 26, 2024
6406d06
fix sqlite in alpine
sstidl Oct 26, 2024
ed9b19f
Merge pull request #671 from BYT-Bender/master
sstidl Oct 26, 2024
a964e3c
change from pr#671
sstidl Oct 26, 2024
513fe3f
Merge branch 'master' of https://github.com/librespeed/speedtest into…
sstidl Oct 26, 2024
783fd37
fix Dual mode is broken #666
sstidl Oct 26, 2024
c0c2a41
Merge pull request #678 from librespeed/fix-docker-images
sstidl Dec 1, 2024
c8696a8
fix Dual mode is broken #666
sstidl Dec 1, 2024
3f20f0e
Merge branch 'fix-dual-mode' of https://github.com/librespeed/speedte…
stefanstidlffg Dec 1, 2024
c00ad26
fix permissions on db file
stefanstidlffg Dec 1, 2024
a177238
improve test scripts
sstidl Dec 1, 2024
a8af966
fix: Update docker docs
janpodrouzek Dec 2, 2024
5cad53e
Merge pull request #687 from iJuhan/fix/docker-docs
sstidl Dec 3, 2024
29e0686
Merge pull request #679 from librespeed/fix-dual-mode
sstidl Dec 29, 2024
de84674
Merge branch 'master' into fix-docker-images
sstidl Dec 29, 2024
fe85a80
documentation of docker tests
sstidl Dec 29, 2024
0274f6e
Update docker/ui.php
sstidl Dec 29, 2024
6d31010
Update docker/ui.php
sstidl Dec 29, 2024
13eb449
Update docker/test/test-script.sh
sstidl Dec 29, 2024
af9cbc0
repair own url detection, switched to js
sstidl Dec 29, 2024
e6fac55
fix phar loading on alpine
sstidl Dec 29, 2024
dd40a3a
Merge pull request #668 from bogdanr/master
sstidl Dec 29, 2024
a1c4397
Merge pull request #693 from librespeed/fix-docker-images
sstidl Feb 13, 2025
fd06e94
feat: allow to specify obfuscation salt string
mkl262 Oct 16, 2025
64e4c3b
Update docker/entrypoint.sh
sstidl Oct 18, 2025
4458c69
Merge pull request #726 from mkl262/master
sstidl Oct 18, 2025
cb265a2
add eslinter, update github actions (stale issues, dependabot), optim…
sstidl Dec 6, 2025
dcf30ad
use alpine base image
stefanstidlffg Dec 6, 2025
81fdf0f
back to php alpine image
stefanstidlffg Dec 6, 2025
4efe5e6
Update Dockerfile.alpine
sstidl Dec 6, 2025
7852e3b
add iconv in alpine
stefanstidlffg Dec 6, 2025
f408183
seperate build base
stefanstidlffg Dec 6, 2025
e6ca54e
Fix/arm alpine (#729)
sstidl Dec 6, 2025
6ab6240
feat: update Dockerfile to use PHP 8.3-alpine3.19 and add QEMU setup …
stefanstidlffg Dec 6, 2025
1c5bde7
Merge pull request #6 from sstidl:fix/arm-alpine
sstidl Dec 6, 2025
fc2dc51
Merge commit '1c5bde7881801181460d7a32a21066bed73125df'
stefanstidlffg Dec 6, 2025
b065fc1
fix alpine image again
stefanstidlffg Dec 6, 2025
cbe05e4
fix dockerfile.alpine
stefanstidlffg Dec 6, 2025
17e4554
add test script for arm docker build
stefanstidlffg Dec 6, 2025
a3ed066
Add alt attribute to speed test results image for accessibility (#731)
Copilot Dec 7, 2025
1360664
Fix SQLite database path to resolve "unable to open database file" er…
Copilot Dec 17, 2025
750f043
Fix critical security vulnerability: Move SQLite database outside web…
Copilot Dec 17, 2025
43116cb
Add ARM v7 architecture to Docker images (#741)
jpauwels Dec 29, 2025
fdd2fd2
version numbers 5.5.0
sstidl Dec 30, 2025
746824b
fix: update docker entrypoint sqlite db matching (#746)
sventec Jan 4, 2026
9830af2
Prepare 5.5.1 hotfix release (#747)
Copilot Jan 11, 2026
85d3dd0
Update doc.md with nginx backend example link
sstidl Jan 23, 2026
734a35f
Fix PHP version check for geoip2.phar compatibility (#754)
Copilot Jan 31, 2026
98f447c
Add .NET client library to README (#739)
Memphizzz Feb 23, 2026
f1f48ae
fix: return client IPv6 address via cloudflared (#757)
MattKobayashi Mar 5, 2026
82b7a26
Bump docker/login-action from 3 to 4 (#763)
dependabot[bot] Mar 11, 2026
7b62e84
Bump docker/metadata-action from 5 to 6 (#761)
dependabot[bot] Mar 11, 2026
983f0ce
Bump docker/setup-buildx-action from 3 to 4 (#759)
dependabot[bot] Mar 11, 2026
7c0b191
Bump docker/build-push-action from 6 to 7 (#762)
dependabot[bot] Mar 11, 2026
e1310d8
Bump docker/setup-qemu-action from 3 to 4 (#760)
dependabot[bot] Mar 11, 2026
3a7dc31
Implement the new design from #649 (#694)
sstidl Apr 11, 2026
6693c7e
Cherry-pick: revert "Use server-list.json in classic frontend by defa…
Copilot Apr 12, 2026
c4ce1d2
doc: design-switch
sstidl Apr 12, 2026
1a45664
version strings sync
stefanstidlffg Apr 12, 2026
49f54a5
add e2e testing (#777)
sstidl Apr 12, 2026
3bd9e1b
chore/playwright mode test plan (#778)
sstidl Apr 12, 2026
d2b9c72
Support legacy `EMAIL` env var as deprecated fallback for `GDPR_EMAIL…
Copilot Apr 12, 2026
cd89d0e
chore(deps): bump actions/checkout from 4 to 6 (#784)
dependabot[bot] Apr 13, 2026
dce0bdd
chore(deps): bump actions/setup-node from 4 to 6 (#783)
dependabot[bot] Apr 13, 2026
da29334
Fix accessibility: replace `div#startStopBtn` with `<button>` in clas…
Copilot Apr 13, 2026
03d62a0
fix: add aria-label to startStopBtn for screen reader accessibility (…
Copilot Apr 13, 2026
d18552f
docker: restore TITLE env handling in entrypoint (#787)
sstidl Apr 14, 2026
18b4660
docker: apply TITLE to modern page heading (#788)
sstidl Apr 14, 2026
c3d6830
chore(release): v6.0.2
Apr 14, 2026
8f0323c
update geoip phar and db
sstidl Apr 18, 2026
ecb2a0e
Add Docker `TAGLINE` env customization for modern frontend slogan (#794)
Copilot Apr 18, 2026
5c56330
Define Release Agent with purpose and responsibilities
sstidl Apr 18, 2026
1ec859d
Rename my-agent.agent.md to release-agent.agent.md
sstidl Apr 18, 2026
853214d
chore(release): v6.1.0 (#795)
Copilot Apr 18, 2026
e52fcda
docs: update install instructions (closes #790)
Apr 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
41 changes: 41 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"env": {
"browser": true,
"es6": true,
"worker": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 2015,
"sourceType": "script"
},
"globals": {
"XMLHttpRequest": "readonly",
"Worker": "readonly",
"Blob": "readonly",
"URL": "readonly",
"navigator": "readonly",
"document": "readonly",
"window": "readonly",
"console": "readonly",
"setTimeout": "readonly",
"clearTimeout": "readonly",
"setInterval": "readonly",
"clearInterval": "readonly",
"postMessage": "readonly",
"onmessage": "writable",
"addEventListener": "readonly"
},
"rules": {
"no-unused-vars": [
"warn",
{
"args": "none"
}
],
"no-console": "off",
"no-empty": "warn",
"no-undef": "warn",
"no-const-assign": "error"
}
}
104 changes: 104 additions & 0 deletions .github/agents/release-agent.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
---
# Fill in the fields below to create a basic custom agent for your repository.
# The Copilot CLI can be used for local testing: https://gh.io/customagents/cli
# To make this agent available, merge this file into the default repository branch.
# For format details, see: https://gh.io/customagents/config

name: Release Agent
description: prepares releases, updates release tags in code, commits release changes, and creates the release tag
---

# My Agent

You are a release automation agent for this repository.

## Purpose

Prepare and finalize releases by analyzing repository state, updating release tags in the codebase, committing those changes, and creating the corresponding Git tag for the release.

## Responsibilities

- Inspect recent changes relevant to the next release
- Summarize user-facing changes, fixes, and breaking changes
- Draft release notes in clear markdown
- Propose a semantic version bump with justification
- Identify and update version or release tag references in the repository
- Commit the release-tag changes
- Create the release Git tag
- Identify release risks, missing checks, and follow-up items
- Verify that release artifacts and documentation appear consistent

## Workflow

1. Determine the likely release scope from recent commits, merged pull requests, and changed files
2. Group changes into:
- Features
- Fixes
- Documentation
- Maintenance
- Breaking changes
3. Recommend the next version:
- patch for fixes or internal changes
- minor for backward-compatible features
- major for breaking changes
4. Identify files that contain the current version or release tag
5. Update those files to the new release version
6. Create a commit for the release changes
7. Create the Git tag for the release
8. Draft release notes with:
- title
- summary
- highlights
- breaking changes, if any
- migration notes, if any
- acknowledgments, if available
9. Flag anything that should block or delay the release:
- failing or missing tests
- missing changelog entries
- undocumented breaking changes
- version inconsistencies
- incomplete release artifacts

## Output Format

When asked to prepare a release, respond with these sections:

### Proposed Version
`<version>` with a brief justification

### Files Updated
List of changed files and the version changes made

### Release Summary
A short paragraph describing the release

### Release Notes
Markdown-ready notes suitable for a GitHub release

### Commit Message
Proposed or created commit message

### Release Tag
Proposed or created tag name

### Risks / Blockers
Bullet list of anything that needs attention before release

### Recommended Next Actions
Short, concrete next steps

### Result
State whether the release changes were prepared only, committed, or fully tagged

## Constraints

- Prefer evidence from the repository over assumptions
- Be precise and concise
- Do not invent changes that are not supported by repository history
- Clearly label uncertain conclusions
- Only change files directly related to versioning or release tagging unless explicitly instructed otherwise
- Keep version updates consistent across all affected files
- Use semantic versioning unless the repository clearly uses a different scheme
- Do not guess hidden release rules; infer them from the repository
- If required files are missing or version locations are ambiguous, explain the issue clearly
- Ask for explicit confirmation before any action that would publish or mutate release state
15 changes: 15 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

version: 2
updates:
- package-ecosystem: "github-actions" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
- package-ecosystem: "docker" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
76 changes: 64 additions & 12 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,43 @@ env:
IMAGE_NAME: ${{ github.repository }}

jobs:
# Keep e2e in this workflow so Docker image build/push is hard-gated by test success.
# Do not move automatic e2e back to playwright.yml, otherwise master pushes run duplicate e2e jobs.
e2e:
runs-on: ubuntu-latest
timeout-minutes: 45

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 20

- name: Install dependencies
run: npm install

- name: Install Playwright Chromium
run: npx playwright install --with-deps chromium

- name: Run Playwright tests
run: npm run test:e2e

build:
needs: e2e
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- dockerfile: ./Dockerfile
image: ghcr.io/${{ github.repository }}
flavour: ""
- dockerfile: ./Dockerfile.alpine
image: ghcr.io/${{ github.repository }}
flavour: "-alpine"
permissions:
contents: read
packages: write
Expand All @@ -35,19 +70,33 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6

# Fetch the ipinfo database file using curl if API key is defined
- name: Fetch DB from ipinfo.io
# IPINFO_APIKEY is set in https://github.com/librespeed/speedtest/settings/secrets/actions
run: |
if [ -z "${{ secrets.IPINFO_APIKEY }}" ]; then
echo "Warning: IPINFO_APIKEY is not defined."
else
curl -L https://ipinfo.io/data/free/country_asn.mmdb?token=${{ secrets.IPINFO_APIKEY }} -o backend/country_asn.mmdb
fi

# Set up QEMU for multi-arch builds
- name: Set up QEMU
uses: docker/setup-qemu-action@v4

# Set up BuildKit Docker container builder to be able to build
# multi-platform images and export cache
# https://github.com/docker/setup-buildx-action
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
Expand All @@ -57,25 +106,28 @@ jobs:
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
images: ${{ matrix.image }}
tags: |
type=ref,event=branch
type=ref,event=pr
type=ref,event=branch,suffix=${{ matrix.flavour }}
type=ref,event=pr,suffix=${{ matrix.flavour }}
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest${{ matrix.flavour }},enable={{is_default_branch}}
type=semver,pattern={{version}}${{ matrix.flavour }}
type=semver,pattern={{major}}${{ matrix.flavour }}
type=semver,pattern={{major}}.{{minor}}${{ matrix.flavour }}
type=semver,pattern={{major}}.{{minor}}.{{patch}}${{ matrix.flavour }}

# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v5
uses: docker/build-push-action@v7
with:
context: .
platforms: linux/amd64,linux/arm64
file: ${{ matrix.dockerfile }}
platforms: linux/amd64,linux/arm64,linux/arm/v7
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Expand Down
30 changes: 30 additions & 0 deletions .github/workflows/playwright.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Playwright E2E

# Manual-only by design:
# - Automatic e2e runs that gate Docker image builds live in docker-publish.yml.
# - Keeping this workflow manual avoids running the same e2e suite twice on master pushes.
on:
workflow_dispatch:

jobs:
e2e:
runs-on: ubuntu-latest
timeout-minutes: 45

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 20

- name: Install dependencies
run: npm install

- name: Install Playwright Chromium
run: npx playwright install --with-deps chromium

- name: Run Playwright tests
run: npm run test:e2e
31 changes: 31 additions & 0 deletions .github/workflows/stale.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
#
# You can adjust the behavior by modifying this file.
# For more information, see:
# https://github.com/actions/stale
name: Mark stale issues and pull requests

on:
schedule:
- cron: '32 18 * * *'

jobs:
stale:

runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write

steps:
- uses: actions/stale@v10
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
stale-pr-message: 'This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
days-before-stale: 60
days-before-close: 7
close-issue-message: 'This issue was automatically closed due to inactivity.'
close-pr-message: 'This pull request was automatically closed due to inactivity.'
stale-issue-label: 'no-issue-activity'
stale-pr-label: 'no-pr-activity'
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
results/idObfuscation_salt.php
backend/getIP_serverLocation.php
db-dir/
.vscode/
node_modules/
package-lock.json
playwright-report/
test-results/
results/speedtest_telemetry.db
results/speedtest_telemetry.db-shm
results/speedtest_telemetry.db-wal
14 changes: 14 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
node_modules/
backend/
results/
docker/
.git/
*.php
*.md
*.sql
*.mmdb
*.phar
*.ttf
*.ico
*.png
*.gif
12 changes: 12 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"printWidth": 120,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": false,
"trailingComma": "none",
"bracketSpacing": true,
"arrowParens": "avoid",
"endOfLine": "lf",
"htmlWhitespaceSensitivity": "ignore"
}
5 changes: 0 additions & 5 deletions .vscode/extensions.json

This file was deleted.

Loading