name: Keep Streamlit Warm on: schedule: - cron: "0 */5 * * *" workflow_dispatch: jobs: warm_app: runs-on: ubuntu-latest timeout-minutes: 15 steps: - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: "20" - name: Install Playwright run: | npm init -y npm install playwright npx playwright install --with-deps chromium - name: Wake Streamlit Community Cloud app env: APP_URL: https://plexi-study.streamlit.app/ run: | cat <<'EOF' > wake-streamlit.mjs import { chromium } from "playwright"; const appUrl = process.env.APP_URL; const browser = await chromium.launch({ headless: true }); const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); try { await page.goto(appUrl, { waitUntil: "domcontentloaded", timeout: 90000 }); const wakeButton = page .getByRole("button", { name: /yes, get this app back up|wake up/i }) .first(); if (await wakeButton.isVisible({ timeout: 10000 }).catch(() => false)) { await wakeButton.click(); await page.waitForTimeout(8000); console.log("App was asleep. Wake-up button clicked."); } else { console.log("Wake-up prompt not shown."); } await page.waitForSelector( "[data-testid='stAppViewContainer'], section.main, div[data-testid='stApp']", { timeout: 90000 } ); console.log("App is reachable."); } finally { await browser.close(); } EOF node wake-streamlit.mjs