new-term-radar
Daily radar for new AI terms: names of new models, products and repos, caught on X, Hugging Face, GitHub and sitemaps before keyword tools list them.
Autonomous LinkedIn content agent for PatientPartner.
Translation pending
MarketingTypeScript · JavaScriptGitHub @deb-langOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Autonomous LinkedIn content engine with a human-in-the-loop approval gate. Generates 2 posts bi-monthly (1st + 15th 8 AM PST by default), schedules approved posts for Tuesday 9 AM / Thursday 10 AM PST via Publer, and tracks performance from a branded dashboard.
[Cron 1st + 15th 8 AM PST] or [Generate Batch button]
↓
[Scrape patientpartner.com/resources] (Cheerio, lib/scraper.ts)
↓
[Claude web-search for fresh industry stats] (lib/stat-finder.ts)
↓
[Content engine picks 2 categories + formats] (lib/content-engine.ts)
↓
[Claude Opus 4.7 generates 2 posts with cached 5K voice prompt + Zod output]
↓
[Quality gates: compliance → self-review → plagiarism → UTM injection]
↓
[Render SVG → PNG (image) / PDF (carousel)] (lib/image-generator.ts)
↓
[Upload to Supabase Storage · insert posts row · audit log]
↓
[Slack: "N posts ready for review"]
↓
[Dashboard /queue — team reviews + approves (or rejects with feedback)]
↓
[Approve → Publer upload + schedule + job poll → status=scheduled]
↓
[LinkedIn publishes at Tue 9am / Thu 10am PST]
↓
[Daily weekday cron syncs insights from Publer → analytics charts]
↓
[Monthly 20th: evergreen scan recycles high-performers with new hook + visual]
| Surface | Tech |
|---|---|
| Frontend | Next.js 16 · Tailwind v4 · Manrope/Inter · Recharts · Sonner |
| Data | Supabase Postgres + Storage (post-assets public bucket) |
| Content | Claude Opus 4.7 · Zod · prompt caching (1h TTL on 5K voice prompt) · adaptive thinking |
| Rendering | @resvg/resvg-js (Rust SVG → PNG) · pdf-lib (carousel PDFs) |
| Publishing | Publer REST (Bearer-API auth · async 202+job_id polling · LinkedIn document carousels) |
| Deploy | Vercel Pro · cron · Password Protection · Edge Config |
/ — Dashboard home (stats, queue count, published count, recent activity)/queue — Approval queue with SWR polling, batch actions, schedule override, audit trail/calendar — Month view with status-color dots per day/history — Filterable table + CSV export/analytics — Trend charts, best/worst post, per-category breakdown/settings — Live integration status + manual controlsPOST /api/generate — orchestrator (manual or cron)GET /api/runs/[id] — poll a generation runGET /api/posts — list with filtersGET /api/posts/[id] — single post + audit trailPOST /api/posts/[id]/approve — approve + Publer schedulePOST /api/posts/[id]/reject — reject + kick off regeneratePOST /api/posts/[id]/regenerate — single-post regen with feedbackPATCH /api/posts/[id]/schedule — override scheduled_forPOST /api/posts/batch-approve — approve manyPOST /api/analytics/sync — pull Publer insights (cron)GET /api/analytics/summary — dashboard + analytics dataGET /api/analytics/calendar?month=YYYY-MM — calendar bucketed by dayGET /api/audit — recent action logPOST /api/scrape/resources — manual scrape triggerPOST /api/recycle/scan — evergreen recycle (cron, monthly 20th)POST /api/webhook/generate — external generate trigger (secured by WEBHOOK_SECRET)GET /api/health — env + Supabase sanity checksupabase/migrations/20260424000000_init.sql → Run.supabase/migrations/20260424_v2_scope.sql → Run.post-assets → Public → Save..env.local.PUBLER_API_KEY.PUBLER_WORKSPACE_ID.curl -H "Authorization: Bearer-API $PUBLER_API_KEY" -H "Publer-Workspace-Id: $PUBLER_WORKSPACE_ID" https://app.publer.com/api/v1/social_accounts — find LinkedIn company account → PUBLER_LINKEDIN_ACCOUNT_ID.ANTHROPIC_API_KEY.#social-media-agent) → copy URL → SLACK_WEBHOOK_URL.GOOGLE_CSE_API_KEY.GOOGLE_CSE_CX.openssl rand -hex 32 # paste into CRON_SECRET
Copy .env.local.example → .env.local and fill in:
# Supabase
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
# Publer
PUBLER_API_KEY=
PUBLER_WORKSPACE_ID=
PUBLER_LINKEDIN_ACCOUNT_ID=
# Anthropic
ANTHROPIC_API_KEY=
# Slack
SLACK_WEBHOOK_URL=
# Google CSE (optional — plagiarism check gracefully skips if unset)
GOOGLE_CSE_API_KEY=
GOOGLE_CSE_CX=
# Cron + webhooks
CRON_SECRET=
WEBHOOK_SECRET=
# Cadence
GENERATION_RUN_DAYS=1,15
# CADENCE_LABEL="1st and 15th"
# App
NEXT_PUBLIC_APP_URL=http://localhost:3000
# Dev safety — when true, approve stops before Publer API call
DEV_MODE=true
npm install
npm run dev # first cold compile is slow (~2-5 min on Next.js 16 + Tailwind v4)
Open http://localhost:3000.
apps/patientpartner-social-agent..env.local. Mark SUPABASE_SERVICE_ROLE_KEY, ANTHROPIC_API_KEY, PUBLER_API_KEY, SLACK_WEBHOOK_URL, CRON_SECRET, WEBHOOK_SECRET, GOOGLE_CSE_API_KEY as Sensitive.DEV_MODE in prod (or set to false).vercel.json registers the 3 crons automatically:
/api/generate · 0 16 1,15 * * (1st + 15th at 8 AM PST)/api/analytics/sync · 0 18 * * 1-5 (weekdays 10 AM PST)/api/recycle/scan · 0 16 20 * * (20th at 8 AM PST)DEV_MODE=true in .env.local:
status=scheduled with publer_post_id=dev_mode_skipped.skipped: "dev_mode".Useful for local/preview testing without touching real LinkedIn.
lib/approved-stats.ts — 34 approved stats with sources. Claude must pull from this list — never invent numbers.lib/constants.ts::VOICE_SYSTEM_PROMPT — 5K-token deterministic prompt with George Kramb's voice, banned vocabulary, anti-AI writing rules, positioning angles, and competitive wedges. Cached 1h TTL on every generation call.lib/compliance-checker.ts) — PHI, off-label claims, fabricated testimonials → auto-block.lib/claude.ts::reviewPost) — originality score 0-100; <60 triggers one rewrite.lib/plagiarism-checker.ts) — Google-searches 5 unique sentences, flags external matches.patientpartner.com link gets ?utm_source=linkedin&utm_medium=social&utm_campaign=....Two migrations in supabase/migrations/:
20260424000000_init.sql — posts, generation_runs, content_sources, external_stats + enums + indexes.20260424_v2_scope.sql — audit_log, social_accounts, quality-gate columns, recycling columns.See the spec at the end of brand/ for full rationale.
lib/ — all business logic (Publer client, Claude client, image generator, compliance, plagiarism, UTM, audit, recycle, scheduler, Slack, storage, scraper, content engine).app/ — pages (6) + API routes (17).components/ — 13 React components, all client-side where interactivity matters.supabase/migrations/ — SQL.templates/ — empty; reserved for future HTML-template extension.brand/ — voice profile, positioning, audience, design tokens, approved stats, image skill.scripts/smoke-images.mjs — standalone PNG render test that bypasses the Next.js build.