diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f250f73..a7b0223 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ concurrency: jobs: lint-and-build: - runs-on: macos-15 + runs-on: macos-26 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7fe58ac..800f249 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,7 @@ concurrency: jobs: build-dmg: - runs-on: macos-15 + runs-on: macos-26 steps: - uses: actions/checkout@v4 diff --git a/.gitignore b/.gitignore index 88cd62e..9b1ffee 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ DerivedData/ .netrc .agents/ /web/.vite +node_modules/ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..43e3465 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,59 @@ +{ + "name": "devtail", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "playwright": "^1.59.1" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..31b352a --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "scripts": { + "og": "npx tsx scripts/render-og-image.ts" + }, + "devDependencies": { + "playwright": "^1.59.1" + } +} diff --git a/scripts/og-image.html b/scripts/og-image.html new file mode 100644 index 0000000..7a9906c --- /dev/null +++ b/scripts/og-image.html @@ -0,0 +1,149 @@ + + + + + + + + +
+
+ +
+
+
devtail
+
macOS menu bar app
+
+ +
+ YOUR TERMINAL + IS TAKEN. + YOUR MENU BAR + ISN’T. +
+ +
+
every process, one menu bar
+
+ Native SwiftUI + <5 MB + macOS 14+ +
+
+
+ + diff --git a/scripts/render-og-image.ts b/scripts/render-og-image.ts new file mode 100644 index 0000000..1d1d9c1 --- /dev/null +++ b/scripts/render-og-image.ts @@ -0,0 +1,23 @@ +import { chromium } from "playwright"; +import { resolve, dirname } from "node:path"; +import { fileURLToPath } from "node:url"; + +async function main() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const htmlPath = resolve(__dirname, "og-image.html"); + const outputPath = resolve(__dirname, "../web/public/og.png"); + + const browser = await chromium.launch(); + const page = await browser.newPage({ + viewport: { width: 1200, height: 630 }, + deviceScaleFactor: 2, + }); + + await page.goto(`file://${htmlPath}`, { waitUntil: "networkidle" }); + await page.screenshot({ path: outputPath, type: "png" }); + + await browser.close(); + console.log(`✓ OpenGraph image saved to ${outputPath}`); +} + +main(); diff --git a/web/index.html b/web/index.html index 08361cf..9bf4f4c 100644 --- a/web/index.html +++ b/web/index.html @@ -6,6 +6,22 @@ devtail — every process, one menu bar + + + + + + + + + + + + + + + + diff --git a/web/public/og.png b/web/public/og.png new file mode 100644 index 0000000..0f15981 Binary files /dev/null and b/web/public/og.png differ