Show HN: ContentRepurpose.pro – Paste once to get LinkedIn/X/Email/IG drafts

1 wcagscans 1 9/18/2025, 11:44:53 AM contentrepurpose.pro ↗
We built ContentRepurpose.pro after getting tired of rewriting the same idea for LinkedIn, X, email, and IG. It’s a simple web app: paste a paragraph → get platform-specific drafts you can tweak, then export to Notion (page) or Trello (card). BYOK works via OpenRouter if you prefer your own key.

Stack/notes: • Frontend: vanilla + Tailwind; auth via Supabase. • Backend: Cloudflare Worker (one file) handling CORS, auth identity, quotas, Stripe (Checkout/Portal/Webhook), OpenRouter calls, and OAuth for Notion/Trello. • Quotas: demo (IP) 5/mo; signed-in free 5/day; paid tiers raise caps. BYOK limits separate from platform pool. • Models: rotating pool by default; BYOK uses whatever model you choose on OpenRouter. We don’t store user keys (BYOK is per-request header). • Exports: Notion page with simple headings/paragraphs; Trello card title/description. (Labels/checklists and Notion DB template are likely next.)

Things we’d love feedback on: • Are the LinkedIn/X outputs “ready to post” length-wise? • Presets UX (saving/renaming/recall) — any friction? • Export ergonomics for Notion/Trello — what would make it cleaner?

Live demo works without login (limited). Pricing is on the site; cancel anytime. Happy to answer technical questions and share more implementation details in the comments.

Comments (1)

wcagscans · 1h ago
Technical details / tradeoffs:

• Identity + quotas: We normalize to either “ip:<addr>” (guest) or “user:<id>” (Supabase JWT). Caps are enforced in Cloudflare KV: daily (“plat:day”), monthly (“plat:mon”), plus separate BYOK counters and a soft-lock flag to avoid hot-spot abuse. • Error handling: We rotate between multiple OpenRouter keys (platform pool) and retry on 429/5xx with small jitter. BYOK path is single-attempt (we don’t want to amplify user key errors). • JSON discipline: The frontend asks the model for a strict JSON shape (linkedin, x, email{subject,body}, instagram) and tries to parse a minimal slice if the model returns extra text. We know strict JSON from LLMs is never 100%; this has worked well enough for now. • Security: BYOK is header-only, not persisted; we don’t log it. OAuth state uses an HMAC-signed payload + short TTL. • Stripe: Checkout for plan selection; Portal for self-serve management; webhook updates the user’s KV record (plan/sub status). • Performance: Worker-only architecture, no origin server. All state in KV is small (counters + per-user record). Cold starts haven’t been an issue in practice.

Open questions we’re exploring: • Better “usage transparency” for BYOK (per-model cost hints). • Notion export to a DB template w/ properties (channel, status, publish date). • Trello labels/checklists on export.

If you hit rough edges, paste repro steps and we’ll ship a fix. Also happy to share the Worker structure in more detail if interesting.