Open-Source Cold Email & Warmup Platform
Warmbly 是開源的冷郵件平台:溫暖您的收件箱、發送活動、並對每個回覆進行分流。可在我們的雲端運行或自行託管整個系統。
AI 翻譯
尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A small CMS for the HTML content the Garber marketing team embeds on dealership websites (Dealer.com content pages, homepage sections, About Us sets and similar).
.html file) to bring it under version control.Repo: push this folder to a GitHub repo, for example rnorcross/garber-content-studio.
Vercel: Add New → Project → import the repo. Framework preset: Next.js. Don't deploy yet.
Database: in the Vercel project, Storage → Create → Neon Postgres, and connect it to the project. This adds DATABASE_URL.
Image storage: Storage → Create → Blob, and connect it to the project. This adds BLOB_READ_WRITE_TOKEN. Uploads go straight from the browser to Blob (no size limit from the serverless function), are stored durably, and are served from Vercel's CDN at permanent URLs.
Environment variables (Project → Settings → Environment Variables):
| Name | Value |
|---|---|
ANTHROPIC_API_KEY | An API key from console.anthropic.com |
AUTH_SECRET | Any random string of 32+ characters (openssl rand -base64 48) |
ADMIN_EMAIL | The first admin's email, e.g. [email protected] |
ADMIN_PASSWORD | A first-sign-in password for that admin (change it after) |
ADMIN_NAME | Optional, e.g. Robert Norcross |
ANTHROPIC_MODEL | Optional, defaults to claude-sonnet-5-5 |
Load the content: open https://<your-app>.vercel.app/setup, enter ADMIN_EMAIL / ADMIN_PASSWORD, and click Run setup. It creates the tables, your admin account, the 35 shared images (uploaded to Blob), and 150 pages — the four Garber Buick originals plus every template for every Garber dealership. Safe to run again; it only adds what's missing, and after the first run only a signed-in admin can run it. (The same thing from a terminal: npx vercel env pull .env.local --environment=production, then npm run db:migrate && npm run db:seed.)
Sign in with ADMIN_EMAIL / ADMIN_PASSWORD and change the password under Account. Add teammates from Team; each gets a temporary password and picks their own on first sign-in.
cp .env.example .env.local # fill in values; a local Postgres works for DATABASE_URL
npm install
npm run db:migrate && npm run db:seed
npm run dev
Every page is a fragment, not a full document: optional social-share meta tags, the Work Sans font link, one <style> block, then one wrapper <div class="gcs-…">. No header or footer, since Dealer.com supplies those. Paste the whole thing into the content area of the Dealer.com page.
Embedded images (data: URIs) work but make the paste heavy. The Images tab lists every image, flags embedded ones, and Host all embedded images uploads them to the media library and swaps in the hosted URLs (the Garber Buick About page drops from about 3 MB to about 116 KB). Any image can also be replaced by uploading, picking from the library, or pasting a URL.
Each dealership's Open Graph image defaults to assets.garberauto.com/assets/open-graph/open-graph-<store>.jpg. The dealership page shows whether that file exists and lets an admin pick or upload a different one.
Without BLOB_READ_WRITE_TOKEN (local development), uploads are saved under .data/uploads instead.
scripts/build-seed.mjs documents how the Garber Buick pages were converted from the preview site; it isn't needed again.lib/dealer-pages.mjs builds each store's version of the five templates from the Garber Buick originals:
Not pre-built: Garber Chevrolet Webster and Garber Subaru (now Parker Automotive, which uses different styling) and the two "(Overall)" campus rows. The Automall CDJR and Ford pages use the Automall campus photo; the Curtis Garber stores have no storefront photo yet, so their About page shows the original Garber building alone.