Skip to content
Open
Show file tree
Hide file tree
Changes from 46 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
20332be
Redesign: Technical Setup and Project Base (#2167)
g-francesca Jan 29, 2026
31e7094
ci: add workflow for Astro site build and linting (#2168)
bjohansebas Jan 29, 2026
474d485
fix: point netlify to astro dir (#2170)
jonchurch Jan 29, 2026
e8dbc45
feat: mobile header and sidebar navigation (#2180)
g-francesca Feb 18, 2026
7f8829d
feat: tablet/desktop header and sidebar navigation (#2185)
g-francesca Feb 24, 2026
c927948
feat: redesign footer (#2196)
g-francesca Feb 25, 2026
d8ed488
feat(redesign): i18n language selection (#2197)
g-francesca Mar 2, 2026
ec12bf5
feat(redesign): Homepage Hero component (#2203)
g-francesca Mar 4, 2026
c62d32b
feat(redesign): Homepage Features and Banner component (#2204)
g-francesca Mar 4, 2026
758adc0
feat(redesign): Alert component (#2205)
g-francesca Mar 5, 2026
c262737
feat(redesign): blog listing page (#2207)
g-francesca Mar 13, 2026
5e8ed6a
feat: add PR link checking workflow, fix links and add fallback to en…
bjohansebas Mar 15, 2026
d9dc34b
Adjust layout content width for responsive sidebar (#2208)
GroophyLifefor Mar 22, 2026
861c8ee
docs: application object overview and express object overview (#2216)
bjohansebas Mar 22, 2026
3857ab5
feat: integrate sitemap functionality and add robots.txt (#2217)
bjohansebas Mar 22, 2026
ad775da
feat: add RSS feed functionality (#2218)
bjohansebas Mar 22, 2026
4d6c42a
feat(redesign): search/chat widget powered by Orama (#2213)
g-francesca Mar 24, 2026
6f97026
chore: add pre commit husky setup (#2195)
ShubhamOulkar Mar 29, 2026
d769095
feat: add redirects for blog posts and legacy API links (#2222)
bjohansebas Mar 29, 2026
84cc5f0
docs: better overviews for apis (#2223)
bjohansebas Mar 30, 2026
02e93e0
feat: enhance layout with Open Graph and Twitter Card metadata (#2224)
bjohansebas Mar 30, 2026
ff16fcd
docs: use the new alert component in docs (#2225)
bjohansebas Mar 30, 2026
336900d
feat(redesign): redesign blog post page (#2228)
g-francesca Mar 30, 2026
af130a1
docs: update headings for consistency across documentation (#2229)
bjohansebas Mar 30, 2026
b4c319f
feat: add Table of Contents to documentation layout (#2230)
bjohansebas Mar 30, 2026
f52cd51
feat: no use i18n folder for blog (#2231)
bjohansebas Mar 31, 2026
64ee5f1
feat: add support page and update content collections (#2232)
bjohansebas Mar 31, 2026
ce267e5
feat: support for global pages (#2233)
bjohansebas Mar 31, 2026
cc749ba
feat: move rosource to the page colection (#2234)
bjohansebas Mar 31, 2026
681cb6d
docs: resolve the last Jekyll includes (#2235)
bjohansebas Mar 31, 2026
620d01f
chore: bump astro v6 (#2236)
bjohansebas Mar 31, 2026
abee2cc
feat: add translation option for page editing in multiple languages (…
bjohansebas Mar 31, 2026
2d4e86b
docs: update more docs for the new website (#2238)
bjohansebas Mar 31, 2026
0770e94
feat: add page navigation for documentation with previous and next li…
bjohansebas Mar 31, 2026
d3e51da
feat: implement scripts for pull external documents (#2240)
bjohansebas Mar 31, 2026
f113821
feat: add RSS feed link and translations for multiple languages (#2241)
bjohansebas Mar 31, 2026
93a0f21
feat: add rehype plugins for automatic heading links and update style…
bjohansebas Mar 31, 2026
067415b
feat: add overview heading to post and table of contents for better n…
bjohansebas Mar 31, 2026
eddbe41
docs: add security.txt (#2244)
bjohansebas Mar 31, 2026
930aa59
feat: add clustering and middleware images for documentation (#2245)
bjohansebas Mar 31, 2026
e6f073d
perf: optimize hero media using WebM/WebP and reduce asset size (#2221)
ShubhamOulkar Apr 2, 2026
a993fac
feat(redesign): Documentation page fixes and improvements (#2251)
g-francesca Apr 2, 2026
e7484f2
chore: move astro project to root (#2253)
bjohansebas Apr 2, 2026
a54c19a
feat: add dependabot and better readme (#2254)
bjohansebas Apr 2, 2026
b9b3b9c
refactor: enhance breadcrumb (#2252)
ShubhamOulkar Apr 3, 2026
091996c
feat: fix crowdin config (#2256)
bjohansebas Apr 3, 2026
055a97c
docs: unify api pages (#2258)
bjohansebas Apr 3, 2026
721133d
feat: generate og images (#2259)
bjohansebas Apr 4, 2026
6a66a98
feat: add LLMS API and documentation endpoints (#2260)
bjohansebas Apr 4, 2026
9cafde4
docs: add documentation for project structure and more (#2261)
bjohansebas Apr 4, 2026
3b9f788
docs: improve migration guide to v5 (#2262)
bjohansebas Apr 4, 2026
e75a587
docs: document removed options for res.sendFile() and express.static(…
22BRS1317 Apr 4, 2026
fa7f964
docs: update routing documentation for separate versions (#2263)
bjohansebas Apr 4, 2026
b2963ed
feat: add AnnouncementBar component with announcement configuration (…
bjohansebas Apr 5, 2026
b854ba8
feat: add logo to community page (#2266)
bjohansebas Apr 5, 2026
9ecdc86
docs: improve more docs (#2267)
bjohansebas Apr 5, 2026
3df5f93
style: fix bugs, and improve layout (#2271)
bjohansebas Apr 11, 2026
d67f565
feat: add kawaii logo (#2272)
bjohansebas Apr 11, 2026
1e9ecd1
feat: update footer links to include AI Coding Assistants Policy (#2273)
bjohansebas Apr 11, 2026
f015a8f
ci: add deploy workflow (#2274)
bjohansebas Apr 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 19 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# EditorConfig: https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[*.{yml,yaml}]
indent_size = 2

[Makefile]
indent_style = tab
5 changes: 3 additions & 2 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
# Codeowners
.github/CODEOWNERS @expressjs/docs-captains

# Blog
_posts @expressjs/express-tc
# Blog - TODO: Add once Astro blog structure is set up

src/content/blog @expressjs/express-tc
58 changes: 45 additions & 13 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,54 @@ updates:
directory: /
schedule:
interval: monthly

- package-ecosystem: docker
directory: /
schedule:
interval: monthly

- package-ecosystem: bundler
directory: /
schedule:
interval: monthly
groups:
github-actions:
patterns:
- '*'

- package-ecosystem: npm
directory: /
schedule:
interval: monthly
open-pull-requests-limit: 10
ignore:
- dependency-name: "*"
update-types: ["version-update:semver-major"]
groups:
astro:
patterns:
- '@astrojs/*'
- 'astro'
- 'astro-*'
- 'prettier-plugin-astro'
orama:
patterns:
- '@orama/*'
- 'gray-matter'
- 'mdast-util-from-markdown'
- 'mdast-util-to-string'
linters:
patterns:
- 'eslint'
- 'eslint-*'
- '@eslint/*'
- 'prettier'
- 'typescript-eslint'
- 'globals'
production:
dependency-type: production
exclude-patterns:
- '@astrojs/*'
- 'astro'
- 'astro-*'
- '@orama/*'
- 'gray-matter'
- 'mdast-util-from-markdown'
- 'mdast-util-to-string'
development:
dependency-type: development
exclude-patterns:
- 'eslint'
- 'eslint-*'
- '@eslint/*'
- 'prettier'
- 'prettier-plugin-astro'
- 'typescript-eslint'
- 'globals'
56 changes: 20 additions & 36 deletions .github/scripts/get-contributing.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,18 @@

# This script replaces the contents of a section with the contents from the annotated source address or local file paths inside the DEST file.

# TODO: change the DEST when astro project is in the root of the repo instead of in a subdirectory.
# read contents of file into memory
DEST="../../en/resources/contributing.md"
DEST="../../src/content/pages/en/resources/contributing.md"

# track the header level
# track the header level
level=''
# tracks src for curl calls
src=''
# tracks file paths for local file reads
local=''
while IFS= read -r line; do
# REMOVE PREVIOUS CONTENT SECTION
# if src or local tags are not empty
if [[ -n "$src" || -n "$local" ]]; then
# if src tags are not empty
if [[ -n "$src" ]]; then
# if current line not a horitzontal rule hr
if [[ "$line" != "----"* ]]; then
# if line == level -- level is num of ##
Expand All @@ -29,63 +28,48 @@ local=''

# PRINT TO PAGE SECTION
src=''
local=''
# if line is a header
if [[ "$line" == '#'* ]]; then
# if header has (#id-of-link) or {#id-on-page} patterns
if [[ $line =~ (\(\#.*\))\. || "$line" =~ \{\#.*\} ]]; then
# isolate the matching part of line
# isolate the matching part of line
match=${BASH_REMATCH[0]}
# remove match - leaving rest
rest=${line//${match}}
# remove any # symbols from start
# remove any # symbols from start
title_rest=${rest##*\#}
# slice rest of line to get only level
level="${rest:0:$((${#rest} - ${#title_rest}))}"
else
# any other headers -- these before SRC/LOCAL pages anchors
header=${line##*\#}
# any other headers -- these before SRC pages anchors
header=${line##*\#}
level="${line:0:$((${#line} - ${#header}))}"
fi
# if line is SRC anchor in read file
# if line is SRC anchor in read file
elif [[ "$line" == '<!-- SRC:'* ]]; then
# remove the first 10 chars
src=${line:10}
# % remove from end until after white space -- leaves src details
src=${src% *}
# if line is LOCAL anchor in read file
elif [[ "$line" == '<!-- LOCAL:'* ]]; then
# remove the first 12 chars
local=${line:12}
# % remove from end until after white space -- leave local details
local=${local% *}
# leave only path to file
local=${local#* }
fi
# prints line to the page
fi
# prints line to the page
echo "$line"

if [[ -n "$local" ]]; then
# cat file -- outputs full contents of file at local path
cat "$local" | \
# remove the top 1# headers from cat'd file
sed -En '/^##|^[^#]/,$p' | \
# remove GH MD specific tags start w '[!NOTE\] + the following line
sed -E '/^>\[!NOTE\]*/{N;d;}' | \
# change GH specific MD IMPORTANT tags -> change into plain MD
sed -E 's/> \[!IMPORTANT\]/> **IMPORTANT:** /g'
echo
elif [[ -n "$src" ]]; then

if [[ -n "$src" ]]; then
echo
path=${src#* }
repo=${src% *}
curl -s "https://raw.githubusercontent.com/${repo}/master/${path}" | \
# if line is ## or not #
sed -En '/^##|^[^#]/,$p' | \
# add additional # every header
# add additional # every header
sed 's/^#/&'"${level:1}"'/g' | \
# format GH links when match
sed -E 's/(\[[^]]*\])\(([^):#]*)\)/\1(https:\/\/github.com\/'"$(sed 's/\//\\\//g' <<< "$repo")"'\/blob\/master\/\2)/g'
sed -E 's/(\[[^]]*\])\(([^):#]*)\)/\1(https:\/\/github.com\/'"$(sed 's/\//\\\//g' <<< "$repo")"'\/blob\/master\/\2)/g' | \
# remove GH MD specific tags start w '[!NOTE]' + the following line
sed -E '/^>\[!NOTE\]*/{N;d;}' | \
# change GH specific MD IMPORTANT tags -> change into plain MD
sed -E 's/> \[!IMPORTANT\]/> **IMPORTANT:** /g'
echo
fi
# read in dest file then write back to file
Expand Down
20 changes: 0 additions & 20 deletions .github/scripts/get-express-version.mjs

This file was deleted.

30 changes: 24 additions & 6 deletions .github/scripts/get-readmes.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
(cat <<LIST_END
expressjs body-parser master
expressjs compression master
expressjs connect-rid master
expressjs cookie-parser master
expressjs cookie-session master
expressjs cors master
Expand All @@ -25,26 +24,45 @@ expressjs serve-static master
expressjs session master
expressjs timeout master
expressjs vhost master
expressjs express master/examples
LIST_END
) | while read org repo branch; do
# TODO: change the DEST when astro project is in the root of the repo instead of in a subdirectory.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Does this need to be changed?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

This has already been fixed, I just forgot to remove the comment.

# Write the README.md to a file named after the repo
DEST="../../_includes/readmes/$repo.md"
DEST="../../src/content/pages/en/resources/middleware/$repo.md"
# When fetching from a branch of a gh repo
GHURL="https://raw.githubusercontent.com/$org/$repo/$branch/README.md"
# When fetching from the latest release of a node module
NPMURL="https://registry.npmjs.org/$repo"

# Preserve existing frontmatter if the file already exists
FRONTMATTER=""
if [ -f "$DEST" ]; then
# Extract full frontmatter block (between --- delimiters)
FRONTMATTER=$(awk '/^---$/{c++;next} c==1{print} c==2{exit}' "$DEST")
fi

if [ -z "$branch" ]; then
# No branch means latest release, so fetch from npmjs.org
echo "fetching $org/$repo from latest npmjs.org release..."
curl -s $NPMURL | jq -r '.readme|rtrimstr("\n")' > $DEST
CONTENT=$(curl -s $NPMURL | jq -r '.readme|rtrimstr("\n")')
else
# This allows us to specify a branch other than master if we want to.
# In this case, the branch name is added to the readme name in the filename.
if [ "$branch" != "master" ]; then
DEST="../../_includes/readmes/$repo-$branch.md"
DEST="../../src/content/pages/en/resources/middleware/$repo-$branch.md"
fi
echo "fetching $org/$repo/$branch from GitHub's raw content domain..."
curl -s $GHURL > $DEST
CONTENT=$(curl -s $GHURL)
fi

# Remove the first h1 heading (title is rendered by the layout)
CONTENT=$(echo "$CONTENT" | sed '0,/^# /{/^# /d}')

# Write with frontmatter preserved
if [ -n "$FRONTMATTER" ]; then
printf '%s\n%s\n%s\n\n%s\n' "---" "$FRONTMATTER" "---" "$CONTENT" > $DEST
else
DESC=$(curl -s "https://registry.npmjs.org/$repo" | jq -r '.description // empty')
printf '%s\n%s\n%s\n%s\n\n%s\n' "---" "title: $repo middleware" "description: $DESC" "---" "$CONTENT" > $DEST
fi
done
103 changes: 103 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
name: ci

on:
pull_request:
branches:
- redesign
pull_request_review:
types: [submitted]
push:
branches:
- redesign

# Cancel in progress workflows
# in the scenario where we already had a run going for that PR/branch/tag but then triggered a new run
concurrency:
group: '${{ github.workflow }} ✨ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
cancel-in-progress: true

permissions:
contents: read

jobs:
lint:
runs-on: ubuntu-latest
if: |
github.event.pull_request.draft != true &&
(github.event_name == 'pull_request_review' && github.event.review.state == 'approved') ||
github.event_name != 'pull_request_review'

steps:
- name: Checkout
uses: actions/checkout@v6
with:
persist-credentials: false

- name: Set up Node.js
uses: actions/setup-node@v6
with:
# node-version-file: ".nvmrc" use when .nvmrc is on root of the repo
node-version: '24.13'
# cache: "npm" use when package-lock.json is on root of the repo

- name: Install Node.js dependencies
run: npm ci

- name: Run tests
shell: bash
run: npm run check

build:
name: build
runs-on: ubuntu-latest
if: |
github.event.pull_request.draft != true &&
(github.event_name == 'pull_request_review' && github.event.review.state == 'approved') ||
github.event_name != 'pull_request_review'

steps:
- uses: actions/checkout@v6
with:
persist-credentials: false

- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install Node.js dependencies
run: npm ci

- name: Build Astro site
run: npm run build

linkChecker:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
persist-credentials: false

- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install Node.js dependencies
run: npm ci

- name: Build Astro site
run: npm run build

- name: Check links
uses: lycheeverse/lychee-action@a8c4c7cb88f0c7386610c35eb25108e448569cb0 # v2.7.0
with:
args: |
--root-dir $PWD/dist
--remap "https://expressjs\.com\/((?:[^\/]+\/)*[^\/\.]+)\/?$ file://$PWD/dist/\$1/index.html"
--remap "https://expressjs\.com\/(.*\.html)$ file://$PWD/dist/\$1"
dist/
fail: true
Loading
Loading