cloudflare
Self-contained deploy automation — invoke directly, do not decompose. Deploys a Vibes app to Cloudflare Workers via the Deploy…
Upload the latest desktop DMG and update artifacts to install.vibesos.com. Use when the user says "upload the DMG", "update install link", "push new DMG", or "release desktop app".
Claude Code
$ npx -y skills add popmechanic/VibesOS --skill upload-dmg --agent claude-code
Codex
$ npx skills add popmechanic/VibesOS --skill upload-dmg -a codex -y
Cursor
$ npx skills add popmechanic/VibesOS --skill upload-dmg -a cursor -y
Gemini CLI
$ npx skills add popmechanic/VibesOS --skill upload-dmg -a gemini-cli -y
GitHub Copilot
$ npx skills add popmechanic/VibesOS --skill upload-dmg -a github-copilot -y
OpenCode
$ npx skills add popmechanic/VibesOS --skill upload-dmg -a opencode -y
Windsurf
$ npx skills add popmechanic/VibesOS --skill upload-dmg -a windsurf -y
name: upload-dmg description: Upload the latest desktop DMG and update artifacts to install.vibesos.com. Use when the user says "upload the DMG", "update install link", "push new DMG", or "release desktop app". license: MIT allowed-tools: Bash, Read metadata: author: "Marcus Estes"
Upload the latest built DMG and auto-updater artifacts to the install worker's R2 bucket.
1. Read the version from plugin.json:
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
VERSION=$(jq -r .version "$VIBES_ROOT/.claude-plugin/plugin.json")
echo "Version: $VERSION"2. Verify the DMG and update artifacts exist:
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
ARTIFACTS="$VIBES_ROOT/vibes-desktop/artifacts"
DMG_PATH="$ARTIFACTS/stable-macos-arm64-VibesOS.dmg"
if [ ! -f "$DMG_PATH" ]; then
echo "ERROR: DMG not found at $DMG_PATH — run 'bash scripts/build-desktop.sh' first"
exit 1
fi
ls -lh "$DMG_PATH"
# Check for update artifacts (optional — first build with baseUrl won't have them)
UPDATE_JSON="$ARTIFACTS/stable-macos-arm64-update.json"
UPDATE_TAR="$ARTIFACTS/stable-macos-arm64-VibesOS.app.tar.zst"
[ -f "$UPDATE_JSON" ] && echo "Found: $(basename $UPDATE_JSON)" || echo "No update.json (first build?)"
[ -f "$UPDATE_TAR" ] && echo "Found: $(basename $UPDATE_TAR) ($(ls -lh "$UPDATE_TAR" | awk '{print $5}'))" || echo "No .tar.zst (first build?)"
PATCH_COUNT=$(ls "$ARTIFACTS"/*.patch 2>/dev/null | wc -l | tr -d ' ')
echo "Patch files: $PATCH_COUNT"3. Upload the DMG:
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
VERSION=$(jq -r .version "$VIBES_ROOT/.claude-plugin/plugin.json")
DMG_PATH="$VIBES_ROOT/vibes-desktop/artifacts/stable-macos-arm64-VibesOS.dmg"
UPLOAD_KEY=$(grep INSTALL_UPLOAD_KEY "$VIBES_ROOT/.env" | cut -d= -f2)
curl -X PUT "https://install.vibesos.com/upload?filename=VibesOS-${VERSION}.dmg" \
-H "X-Upload-Key: ${UPLOAD_KEY}" \
--data-binary "@${DMG_PATH}" \
--progress-bar -w "\nHTTP %{http_code}\n"4. Upload update artifacts (update.json and .tar.zst):
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
ARTIFACTS="$VIBES_ROOT/vibes-desktop/artifacts"
UPLOAD_KEY=$(grep INSTALL_UPLOAD_KEY "$VIBES_ROOT/.env" | cut -d= -f2)
UPDATE_JSON="$ARTIFACTS/stable-macos-arm64-update.json"
UPDATE_TAR="$ARTIFACTS/stable-macos-arm64-VibesOS.app.tar.zst"
if [ -f "$UPDATE_JSON" ]; then
echo "Uploading update.json..."
curl -X PUT "https://install.vibesos.com/upload?filename=updates/stable-macos-arm64-update.json" \
-H "X-Upload-Key: ${UPLOAD_KEY}" \
--data-binary "@${UPDATE_JSON}" \
-s -w "HTTP %{http_code}\n"
else
echo "Skipping update.json (not found)"
fi
if [ -f "$UPDATE_TAR" ]; then
echo "Uploading .tar.zst..."
curl -X PUT "https://install.vibesos.com/upload?filename=updates/stable-macos-arm64-VibesOS.app.tar.zst" \
-H "X-Upload-Key: ${UPLOAD_KEY}" \
--data-binary "@${UPDATE_TAR}" \
--progress-bar -w "\nHTTP %{http_code}\n"
else
echo "Skipping .tar.zst (not found)"
fi5. Upload patch files (if any):
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
ARTIFACTS="$VIBES_ROOT/vibes-desktop/artifacts"
UPLOAD_KEY=$(grep INSTALL_UPLOAD_KEY "$VIBES_ROOT/.env" | cut -d= -f2)
PATCHES=$(ls "$ARTIFACTS"/*.patch 2>/dev/null)
if [ -n "$PATCHES" ]; then
for PATCH in $PATCHES; do
BASENAME=$(basename "$PATCH")
echo "Uploading patch: $BASENAME..."
curl -X PUT "https://install.vibesos.com/upload?filename=updates/${BASENAME}" \
-H "X-Upload-Key: ${UPLOAD_KEY}" \
--data-binary "@${PATCH}" \
-s -w "HTTP %{http_code}\n"
done
else
echo "No patch files to upload"
fi6. Confirm the upload by reporting the version and download URL:
Uploaded VibesOS-{VERSION}.dmg + update artifacts
Download: https://install.vibesos.com
Update check: https://install.vibesos.com/updates/stable-macos-arm64-update.jsonInstantly make your own small multi-user apps, without a backend. For apps made with Vibes, the front-end is the app.
Self-contained deploy automation — invoke directly, do not decompose. Deploys a Vibes app to Cloudflare Workers via the Deploy…
Self-contained design transformer — invoke directly, do not decompose. Transforms a design reference HTML file into a Vibes app.…
Self-contained SaaS pipeline — invoke directly, do not decompose. Generates a factory app with landing page, Stripe subscription…
Self-contained parallel generator — invoke directly, do not decompose. Generates 3-10 app variations in parallel for comparing…
Self-contained test automation — invoke directly, do not decompose. End-to-end integration test that assembles a fixture, deploys…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.