Open-Source Cold Email & Warmup Platform
Warmbly 是開源的冷郵件平台:溫暖您的收件箱、發送活動、並對每個回覆進行分流。可在我們的雲端運行或自行託管整個系統。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Digital marketing agencies manage multiple brands/clients simultaneously. Researching a brand's tone, scraping their website for context, analyzing competitors, and generating high-quality SEO blogs and marketing strategies is highly manual, time-consuming, and unscalable.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗AI-powered multi-brand marketing agency operating system.
UpTrendifyOS is a production-oriented marketing operating system for agencies and businesses. An agency can manage multiple brands from one workspace; a business can focus on its own brand. The product turns a brand website into source-backed research, an editable Brand Brain, strategy, content, campaigns, approvals and controlled publishing workflows.
Onboard → Research → Understand → Strategize → Generate → Review → Approve → Publish → Measure → Optimize
The repository has now been initialized around a real production architecture rather than a mini-project prototype.
docs/PRD.md — product requirements and acceptance criteria.docs/ARCHITECTURE.md — application, AI, security, research and deployment architecture.supabase/migrations/0001_initial_schema.sql — multi-tenant database schema.supabase/migrations/0002_rls.sql — tenant-isolation policies.supabase/migrations/0003_hardening.sql — hardening constraints, indexes, cleanup.supabase/migrations/0004_brand_intelligence.sql — research/brain task linkage and indexes.supabase/migrations/0005_strategy_engine.sql — strategy lifecycle columns, ai_tasks.strategy_id, versioning..env.example — safe environment-variable template.The Next.js foundation uses the current Next.js 16 line, TypeScript, Supabase SSR support, Zod validation and a responsive SaaS design system. The application shell already includes the agency dashboard information architecture and the initial Brand Health / AI Recommendations experience.
Engineering phase numbers are implementation history, not instructions for users. The product guides users through one canonical journey:
Workspace → Brand → Brand Ground Rules → Research → Brand Intelligence → Strategy → Content → Campaigns → Approval → Publishing
npm install
cp .env.example .env.local
npm run dev
Then open http://localhost:3000.
For Supabase, create a project, enable the required extensions, and apply all repository migrations in order through the current latest migration. Production is currently synchronized through 0030_timezone_alias_normalization.sql.
Recommended command when the Supabase project is linked:
npx supabase db push
The migration directory is the source of truth; do not selectively stop at the older 0001–0005 foundation migrations.
The brand-overview journey starts from the dashboard (/brands → /brands/[brandId]):
POST /api/brands/:brandId/research queues a bounded website crawl for the brand's website_url. The request is idempotent via an optional idempotencyKey, and a second kick while a run is active returns 409.brand_sources, links them to the run in research_sources, and writes text chunks to brand_source_chunks.brand_intelligence analysis runs in the background: evidence is packed into a bounded context window and a JSON response is parsed against a strict schema (identity, audience, positioning, offer, messaging, SEO, competition + cited evidence claims). Transient provider errors (429/502/503, network drops) are retried with back-off.brand_facts, source_type = AI_INFERRED) and insights (brand_insights, metadata.origin = brand-intelligence) are regenerated atomically each run; prior AI-inferred rows are replaced.GET /api/brands/:brandId/brain and GET /api/brands/:brandId/research (run history + AI task status) power the brand overview page, which auto-refreshes while a run is in progress.Run states: QUEUED → RUNNING → COMPLETED | PARTIAL | FAILED. AI task states: RUNNING → SUCCEEDED | FAILED | SKIPPED. Everything is tenant-scoped by organization_id and every API/UI path re-checks membership + role (CAN_RUN_RESEARCH / CAN_VIEW_BRAND).
The strategy starting point is the Brand Brain (/brands/[brandId] → strategy section):
POST /api/brands/:brandId/strategy queues a strategy job (idempotent via idempotencyKey, 409 while one is active, versions auto-increment per brand).INSUFFICIENT_BRAIN (no AI call).strategy_generation runs against the default AI provider and returns a Zod-validated 14-section JSON document (executive summary, business understanding, objectives, ICP, positioning, messaging, content, SEO, channels, campaigns, 90-day roadmap, KPIs, risks/gaps, assumptions). A single repair attempt recovers from malformed output; invalid output is never persisted as SUCCEEDED.strategies.output with an input_snapshot (assumptions separated from evidence), linked ai_tasks usage/latency, and an audit_logs strategy.generated entry.GET /api/brands/:brandId/strategy returns the latest version with full output plus version history and role-aware canGenerate; the dashboard shows strategy counts and recent strategy activity.Strategy states: QUEUED → RUNNING → SUCCEEDED | FAILED with error_code/error_message (e.g. STRATEGY_VALIDATION_FAILED, AI_GENERATION_FAILED, PROVIDER_UNCONFIGURED). Generation is gated by CAN_GENERATE_STRATEGY (OWNER/ADMIN/STRATEGIST/EDITOR).
DEFAULT_AI_PROVIDER selects the primary provider (Groq by default), with configured OpenAI/Anthropic providers as alternates; configure keys in .env.local:
GROQ_API_KEY=
GROQ_MODEL=openai/gpt-oss-120b
GROQ_VISION_MODEL=qwen/qwen3.8-27b
DEFAULT_AI_PROVIDER=groq
Without any configured key, the pipeline still records an AI task failure with PROVIDER_UNCONFIGURED; the rest of the application remains usable.
AI_EXECUTION_MODE controls whether AI runs for real (or at all):
live (default) — production behavior. Research, Brand Brain and Strategy call the configured provider and surface live failure states.replay — deterministic presentation mode for the seeded Aurora Labs workspace. The app never calls a model; the aurora-labs-presentation organization replays from the bundled fixture (lib/replay/fixtures/aurora.json). Every other workspace keeps the normal live behavior, and a small "Presentation Replay" badge appears in the top bar while it is active.The fixture data (lib/replay/index.ts + lib/replay/fixtures/aurora.json) is the single source of truth for both the seed and the replay runtime, so a watched demo always matches the seeded state.
# 1. Ensure migrations 0001–0007 are applied to local Supabase, then set:
cp .env.example .env.local # fill NEXT_PUBLIC_SUPABASE_URL + the two Supabase keys
export AI_EXECUTION_MODE=replay # (or .env.local: AI_EXECUTION_MODE=replay)
# 2. Seed the deterministic presentation workspace (idempotent, safe to re-run):
node scripts/seed-presentation.cjs
# 3. Run the app and sign in:
npm run dev
# email: [email protected]
# password: uptrendify-demo
Open the Aurora Labs brand and walk: Brand → Website Research → Brand Brain → Review → Approve → Brand Intelligence → Strategy.
The seed pre-approves six Brand Brain facts (brand name, what the company does, industry, audience, value proposition, differentiators) so the strategy approval gate is already satisfied and a SUCCEEDED strategy v1 is visible immediately. The remaining suggestions are PENDING so a presenter reviews them live — approving/rejecting/editing/regenerating uses the normal review API. In replay mode, "Start research", "Generate strategy" and "Regenerate suggestion" complete deterministically and synchronously so the demo never waits on a model call.
Re-running node scripts/seed-presentation.cjs resets the brand to the pristine presentable state. To remove the workspace, delete the organization with slug = aurora-labs-presentation. Setting AI_EXECUTION_MODE=live (or unsetting it) restores full production behavior.
Cross-device behavior: confirmation can be opened on a phone or another device. The confirming device receives a confirmation-only screen and is not left signed into the app. The device where signup started keeps the signup flow active and automatically signs in/continues to onboarding after confirmation. If that original device is closed, the user can simply sign in normally after confirmation.
Cross-device note: confirmation emails must not use a private
localhostorigin. The app automatically falls back tohttps://uptrendify-os.vercel.appwhen signup is initiated from localhost. For a custom deployment domain, setNEXT_PUBLIC_APP_URLto that public URL so confirmation and resend links use it consistently.
The application uses Supabase Auth with the PKCE browser flow and hosted email confirmation. SMTP delivery (for example Pingram) is the transport; the confirmation link itself must use the SSR-safe token-hash flow.
In Supabase Dashboard → Authentication → Email Templates → Confirm signup, use the repository template at supabase/templates/confirmation.html. The important link is:
{{ .RedirectTo }}?token_hash={{ .TokenHash }}&type=email
Also add the deployed application URL as an allowed redirect/site URL in Supabase Auth URL configuration. The app dynamically uses the current origin for signup/resend links, so local and hosted environments keep their own URLs.
Flow:
Register → Supabase creates pending user → Pingram sends confirmation → /auth/confirm verifies token_hash → SSR session cookie is established → onboarding/dashboard
The app also provides Resend confirmation email on both the registration confirmation screen and the login screen when an account is still unconfirmed.
Owners and Admins can open Settings → System health to verify the deployed Browser → Vercel → Supabase boundary. The diagnostics page checks the active deployment identity, effective Supabase project, Auth reachability, tenant membership, and runtime schema contracts for onboarding, campaigns, publishing, preferences, tours, and team invitations.
/api/health is a fast public liveness/config probe; external reachability is reported as telemetry rather than turning the app into a 503. /api/diagnostics is authenticated and is intentionally the deeper Browser → Vercel → Supabase readiness/contract check.
npm run typecheck
npm test # unit tests across lib/ai, lib/research, lib/strategy, and API routes
npm run build # next build (all app + API routes)
Full end-to-end verification boots the app with a real provider against local Supabase:
VERIFY_APP=http://localhost:3000 VERIFY_PROVIDER=groq node /tmp/opencode/verify-research.cjs
VERIFY_APP=http://localhost:3100 node /tmp/opencode/verify-strategy.cjs # with GROQ_MODEL configured in the dev server
UpTrendifyOS uses a provider abstraction so the core application does not depend on one vendor.
Initial providers:
Optional adapters can be added for:
These are integrations, not the application's source of truth.
organization_id.UpTrendifyOS should feel like a calm, modern combination of an agency command center, AI workspace and SaaS product — not a generic admin template. Light is the default for long daily usage; users can switch between Light, Dark and System.
The visual language is:
Repository, architecture, database, RLS, environment, design system.
Authentication, organizations, roles, clients, brands, dashboard.
URL ingestion, research jobs, evidence storage, Brand Brain.
SEO opportunities, competitors, strategy generation.
Content Studio, versions, reviews, approvals, campaigns.
Tool-using agent with controlled domain actions and audit logs.
Semrush, Surfer, Jasper and GHL adapters where credentials/licensing exist.
Tests, observability, retries, rate limiting, deployment and security verification.