The web rule uses plain sync: Nginx 75 reads files from disk per request, so a copied file is live at once, with no restart. With the API's rules from Compose Watch, one watch covers both tiers:
docker compose watch --no-up > ../watch.log 2>&1 & sleep 3
sed -i 's/served by its own REST API/served by Nginx and its REST API/' public/index.html
sleep 3; curl -s localhost:33080/ | grep -o 'served by[^<]*'
grep Syncing ../watch.log; docker compose ps web --format '{{.Status}}'
kill %1; git checkout -q public/index.htmlOutput
served by Nginx and its REST API. Syncing service "web" after 2 changes were detected Up 9 seconds (healthy)
The edit went live without a restart. A synced file stays in the container after you revert it with watch stopped, until the next up --build, and an edit to the Nginx template needs a rebuild, which a rebuild rule on ./web would automate.