diff --git a/.github/workflows/scheduled-task_update-readme.yml b/.github/workflows/scheduled-task_update-readme.yml
new file mode 100644
index 000000000..4d799ac52
--- /dev/null
+++ b/.github/workflows/scheduled-task_update-readme.yml
@@ -0,0 +1,10 @@
+name: Update README
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: 30 15 * * 0
+jobs:
+ update-readme:
+ uses: serversideup/.github/.github/workflows/update-readme.yml@master
+ permissions:
+ contents: write
diff --git a/.github/workflows/scheduled-task_update-sponsors.yml b/.github/workflows/scheduled-task_update-sponsors.yml
deleted file mode 100644
index 3d1d233b1..000000000
--- a/.github/workflows/scheduled-task_update-sponsors.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-name: Generate Sponsors README
-on:
- workflow_dispatch:
- schedule:
- - cron: 30 15 * * 0
-jobs:
- deploy:
- runs-on: ubuntu-24.04
- steps:
- - name: Checkout ๐๏ธ
- uses: actions/checkout@v6
-
- - name: Generate Sponsors ๐
- uses: JamesIves/github-sponsors-readme-action@v1
- with:
- organization: true
- minimum: 4900
- maximum: 5100
- fallback: 'No bronze sponsors yet. Become a sponsor โ'
- token: ${{ secrets.SPONSORS_README_ACTION_PERSONAL_ACCESS_TOKEN }}
- marker: 'bronze'
- template: '
'
- file: 'README.md'
-
- - name: Generate Sponsors ๐
- uses: JamesIves/github-sponsors-readme-action@v1
- with:
- organization: true
- maximum: 500
- fallback: '
'
- file: 'README.md'
-
- - name: Deploy to GitHub Pages ๐
- uses: JamesIves/github-pages-deploy-action@v4
- with:
- branch: main
- folder: '.'
\ No newline at end of file
diff --git a/README.md b/README.md
index 0df87081b..57d26ba99 100644
--- a/README.md
+++ b/README.md
@@ -138,36 +138,46 @@ Need help getting started? Join our Discord community and we'll help you out!
+### Platinum Sponsors
+
-#### Bronze Sponsors
-No bronze sponsors yet. Become a sponsor โ
+### Silver Sponsors
+
-#### Infrastructure Sponsors
-This project requires significant computing power to build and maintain over 8,000 different Docker image tags. We're extremely grateful for the following sponsors:
+### Infrastructure Sponsors
+These companies give us free access to the tools and infrastructure we use to build, test, and ship our open source projects. Their support helps our entire community.
-
-
-#### Individual Supporters
-
+
+
+
## About Us
We're [Dan](https://x.com/danpastori) and [Jay](https://x.com/jaydrogers) - a two-person team with a passion for open source products. We created [Server Side Up](https://serversideup.net) to help share what we learn.
+### Hire Us
+Get two senior Laravel experts who deliver quality code with predictable monthly pricing. [Dan](https://x.com/danpastori) and [Jay](https://x.com/jaydrogers) have 30+ years of combined experience building scalable Laravel applications.
+
+- **๐ฏ Complete Laravel expertise** - Full-stack development, CI/CD, database optimization, mobile apps
+- **๐ฐ Predictable pricing** - Fixed monthly subscription, no hourly billing surprises, 40%+ savings
+- **โก Maximum productivity** - 90%+ development time, no meetings, results in days not weeks
+- **๐ก๏ธ Risk-free** - 7-day money-back guarantee, cancel anytime
+
+**[๐ฌ Discuss Your Project โ](https://serversideup.net/hire-us)**
+
### Find us at:
* **๐ [Blog](https://serversideup.net)** - Get the latest guides and free courses on all things web/mobile development.
@@ -175,21 +185,24 @@ We're [Dan](https://x.com/danpastori) and [Jay](https://x.com/jaydrogers) - a tw
* **๐คตโโ๏ธ [Get Professional Help](https://serversideup.net/professional-support)** - Get video + screen-sharing support from the core contributors.
* **๐ป [GitHub](https://github.com/serversideup)** - Check out our other open source projects.
* **๐ซ [Newsletter](https://serversideup.net/subscribe)** - Skip the algorithms and get quality content right to your inbox.
-* **๐ฅ [Twitter](https://x.com/serversideup)** - You can also follow [Dan](https://x.com/danpastori) and [Jay](https://x.com/jaydrogers).
+* **๐ฅ [X (Twitter)](https://x.com/serversideup)** - You can also follow [Dan](https://x.com/danpastori) and [Jay](https://x.com/jaydrogers).
* **โค๏ธ [Sponsor Us](https://github.com/sponsors/serversideup)** - Please consider sponsoring us so we can create more helpful resources.
## Our Products
If you appreciate this project, be sure to check out our other projects.
-### ๐ Books
-- **[The Ultimate Guide to Building APIs & SPAs](https://serversideup.net/ultimate-guide-to-building-apis-and-spas-with-laravel-and-nuxt3/)**: Build web & mobile apps from the same codebase.
-- **[Building Multi-Platform Browser Extensions](https://serversideup.net/building-multi-platform-browser-extensions/)**: Ship extensions to all browsers from the same codebase.
-
-### ๐ ๏ธ Software-as-a-Service
-- **[Bugflow](https://bugflow.io/)**: Get visual bug reports directly in GitHub, GitLab, and more.
-- **[SelfHost Pro](https://selfhostpro.com/)**: Connect Stripe or Lemonsqueezy to a private docker registry for self-hosted apps.
+### ๐ ๏ธ Premium
+- **[Self-Host Pro](https://selfhostpro.com)**: Sell self-hosted software in minutes.
+- **[Spin Pro](https://getspin.pro)**: Production-ready Docker templates for shipping quickly.
### ๐ Open Source
-- **[AmplitudeJS](https://521dimensions.com/open-source/amplitudejs)**: Open-source HTML5 & JavaScript Web Audio Library.
-- **[Spin](https://serversideup.net/open-source/spin/)**: Laravel Sail alternative for running Docker from development โ production.
-- **[Financial Freedom](https://github.com/serversideup/financial-freedom)**: Open source alternative to Mint, YNAB, & Monarch Money.
\ No newline at end of file
+- **[Spin](https://serversideup.net/open-source/spin/)**: Docker Simplified. Deploy Anywhere. Zero Downtime. Any OS.
+- **[Financial Freedom](https://serversideup.net/open-source/financial-freedom/)**: Open source alternative to Mint, YNAB, and more.
+- **[AmplitudeJS](https://serversideup.net/open-source/amplitudejs/)**: Customize the design of any element of the HTML5 Audio Player.
+- **[webext-bridge](https://serversideup.net/open-source/webext-bridge/)**: Messaging in Web Extensions made easy. Batteries included.
+- **[serversideup/ansible](https://github.com/serversideup/docker-ansible)**: Run Ansible anywhere with a lightweight and powerful Docker image.
+
+### ๐ Books
+- **[Building Browser Extensions](https://serversideup.net/products/building-multi-platform-browser-extensions/)**: Build browser extensions for Firefox, Chrome, and more.
+- **[Ultimate Guide To Building APIs & SPAs](https://serversideup.net/products/ultimate-guide-to-building-apis-and-spas-with-laravel-and-nuxt3/)**: Build web and mobile apps from the same codebase.
+
diff --git a/docs/content/docs/8.reference/2.command-reference.md b/docs/content/docs/8.reference/2.command-reference.md
index 02263e4db..bc82ed2ed 100644
--- a/docs/content/docs/8.reference/2.command-reference.md
+++ b/docs/content/docs/8.reference/2.command-reference.md
@@ -24,6 +24,22 @@ This command will detect the operating system and install packages if it is an A
docker-php-serversideup-dep-install-alpine git
```
+Packages can be passed as separate arguments, as a comma-separated list, or split across multiple lines with backslash continuations:
+
+```bash [Example - Installing multiple packages on Alpine]
+# Separate arguments
+docker-php-serversideup-dep-install-alpine git zip unzip
+
+# Comma-separated
+docker-php-serversideup-dep-install-alpine "git, zip, unzip"
+
+# Backslash continuations (useful in a Dockerfile)
+docker-php-serversideup-dep-install-alpine \
+ git \
+ zip \
+ unzip
+```
+
## docker-php-serversideup-dep-install-debian
This command will detect the operating system and install packages if it is a Debian based system. This is helpful if you're building multiple operating systems from the same Dockerfile.
@@ -32,6 +48,22 @@ This command will detect the operating system and install packages if it is a De
docker-php-serversideup-dep-install-debian git
```
+Packages can be passed as separate arguments, as a comma-separated list, or split across multiple lines with backslash continuations:
+
+```bash [Example - Installing multiple packages on Debian]
+# Separate arguments
+docker-php-serversideup-dep-install-debian git zip unzip
+
+# Comma-separated
+docker-php-serversideup-dep-install-debian "git, zip, unzip"
+
+# Backslash continuations (useful in a Dockerfile)
+docker-php-serversideup-dep-install-debian \
+ git \
+ zip \
+ unzip
+```
+
## docker-php-serversideup-entrypoint
Our default entrypoint script that is used for all images.
diff --git a/src/common/usr/local/bin/docker-php-serversideup-dep-install-alpine b/src/common/usr/local/bin/docker-php-serversideup-dep-install-alpine
index be14e8acd..80a47dcce 100644
--- a/src/common/usr/local/bin/docker-php-serversideup-dep-install-alpine
+++ b/src/common/usr/local/bin/docker-php-serversideup-dep-install-alpine
@@ -3,6 +3,14 @@ set -oe
###################################################
# Usage: docker-php-serversideup-dep-install-alpine [alpine-packages]
+#
+# Packages may be passed as separate arguments, comma-delimited, or both:
+#
+# docker-php-serversideup-dep-install-alpine git, zip
+#
+# docker-php-serversideup-dep-install-alpine \
+# git \
+# zip
###################################################
# This script installs alpine packages that are passed to it
@@ -27,20 +35,34 @@ fi
############
# Functions
############
+# Accepts any mix of space-separated arguments and comma-delimited lists
+# (e.g. "pkg1, pkg2" or "pkg1 pkg2" or "pkg1 \ pkg2" across lines in a Dockerfile)
convert_comma_delimited_to_space_separated() {
- echo $1 | tr ',' ' '
+ printf '%s\n' "$*" | tr ',' ' '
}
############
# Main
############
-DEP_PACKAGES=$(convert_comma_delimited_to_space_separated "$@")
+# Re-split into one argument per package. Globbing is disabled so a package
+# name such as "php*" is never expanded against files in the working directory.
+set -f
+set -- $(convert_comma_delimited_to_space_separated "$@")
+set +f
+
+if [ $# -eq 0 ]; then
+ echo "โน๏ธ INFO ($script_name): No packages were found in the arguments. Continuing..."
+ exit 0
+fi
+
+# "$*" joins the packages with single spaces for display
+DEP_PACKAGES="$*"
echo "๐ค Installing: $DEP_PACKAGES"
-apk update
-apk add --no-cache $DEP_PACKAGES
+apk update
+apk add --no-cache "$@"
echo "๐งผ Cleaning up installation of: $DEP_PACKAGES"
rm -rf /var/cache/apk/*
-echo "โก๏ธ Completed installation of: $DEP_PACKAGES"
\ No newline at end of file
+echo "โก๏ธ Completed installation of: $DEP_PACKAGES"
diff --git a/src/common/usr/local/bin/docker-php-serversideup-dep-install-debian b/src/common/usr/local/bin/docker-php-serversideup-dep-install-debian
index 309a9cf97..40e3b66f9 100644
--- a/src/common/usr/local/bin/docker-php-serversideup-dep-install-debian
+++ b/src/common/usr/local/bin/docker-php-serversideup-dep-install-debian
@@ -3,6 +3,14 @@ set -oe
###################################################
# Usage: docker-php-serversideup-dep-install-debian [debian-packages]
+#
+# Packages may be passed as separate arguments, comma-delimited, or both:
+#
+# docker-php-serversideup-dep-install-debian git, zip
+#
+# docker-php-serversideup-dep-install-debian \
+# git \
+# zip
###################################################
# This script installs debian packages that are passed to it
@@ -28,17 +36,31 @@ fi
############
# Functions
############
+# Accepts any mix of space-separated arguments and comma-delimited lists
+# (e.g. "pkg1, pkg2" or "pkg1 pkg2" or "pkg1 \ pkg2" across lines in a Dockerfile)
convert_comma_delimited_to_space_separated() {
- echo $1 | tr ',' ' '
+ printf '%s\n' "$*" | tr ',' ' '
}
############
# Main
############
-DEP_PACKAGES=$(convert_comma_delimited_to_space_separated "$@")
+# Re-split into one argument per package. Globbing is disabled so a package
+# name such as "php*" is never expanded against files in the working directory.
+set -f
+set -- $(convert_comma_delimited_to_space_separated "$@")
+set +f
+
+if [ $# -eq 0 ]; then
+ echo "โน๏ธ INFO ($script_name): No packages were found in the arguments. Continuing..."
+ exit 0
+fi
+
+# "$*" joins the packages with single spaces for display
+DEP_PACKAGES="$*"
echo "๐ค Installing: $DEP_PACKAGES"
apt-get update
-apt-get install -y $DEP_PACKAGES
+apt-get install -y "$@"
echo "๐งผ Cleaning up installation of: $DEP_PACKAGES"