{{ toast.msg }} ✕

Library

Everything you've made and kept. Drag one onto a studio to use it again.

Nothing saved for this project yet. Anything you make and keep lands here.

{{ a.kind || 'file' }}

{{ a.title || a.kind || 'Saved asset' }}

Open

Projects

{{ projects.length }}/{{ projectCap }} used on your {{ planLabel }} plan · {{ paidExtraDomains }} add-on{{ paidExtraDomains === 1 ? '' : 's' }} (${{ paidExtraDomains * 15 }}/mo)

Current

{{ p.url || 'No URL set' }}

Preparing brand kit…

{{ projects.length }} of {{ projectCap }} project{{ projectCap === 1 ? '' : 's' }} used · {{ paidExtraDomains }} paid add-on{{ paidExtraDomains === 1 ? '' : 's' }}

You're at your plan's {{ projectCap }} — adding opens an upgrade or a $15/mo add-on.

{{ currentPlan === 'free' ? 'Adding more sites needs Pro or Serial' : "You're at your project limit" }}

{{ currentPlan === 'free' ? 'Your Free plan includes 1 project. Upgrade to add this project.' : ('Your ' + planLabel + ' plan includes ' + projectCap + ' project' + (projectCap === 1 ? '' : 's') + '. Upgrade to a plan with more.') }}

See all plans →

Billed by Stripe. Manage or cancel any time in Settings → Subscription.

This is your {{ ordinal(projects.length + 1) }} project

Your {{ planLabel }} plan includes {{ planBaseDomains }} project{{ planBaseDomains === 1 ? '' : 's' }}. Adding this one is an extra-project add-on — +$15/mo, added to your subscription and prorated from today.

You already have {{ paidExtraDomains }} paid add-on{{ paidExtraDomains === 1 ? '' : 's' }} (${{ paidExtraDomains * 15 }}/mo). This makes {{ paidExtraDomains + 1 }} (${{ (paidExtraDomains + 1) * 15 }}/mo).

Billed by Stripe against the card on your subscription. Remove the project later and the add-on decrements automatically.

Set a new password

Choose a new password for your account.

{{ (newPassword.length > 0 && newPassword.length < 6) ? ('Too short — at least 6 characters (' + newPassword.length + '/6).') : 'At least 6 characters.' }}

{{ auth.error }}

{{ auth.notice }}

{{ auth.mode==='password' && auth.intent==='signin' ? 'Welcome back' : 'Create your account' }}

Your build-in-public sidekick.

Free to start, no card. Create your account and confirm the email we send, opening the link in this same browser. Your update and its drafts are then saved into your project, ready for you to approve. Nothing is posted until you do.

Free to start, no card. You came from the weekly page for {{ shippedIntent.repo }}. Create your account and confirm the email we send, opening the link in this same browser: the next screen has {{ shippedIntent.site ? 'its site filled in' : 'it noted' }}, so FoxPlug can write the same weekly page for your own repository.

Free to start. Once you are in, your new project setup opens{{ launchIntent.name ? ' with ' + launchIntent.name + ' filled in' : (launchIntent.typeLabel ? ' with the ' + launchIntent.typeLabel + ' category noted' : '') }}.

Free to start, no card. Three steps:

  1. Create your account and confirm the email we send.
  2. Paste your product's web address.
  3. FoxPlug reads your site and lists your pages.

See what each plan includes

or use your email

{{ (auth.password.length > 0 && auth.password.length < 6) ? ('Too short — at least 6 characters (' + auth.password.length + '/6).') : 'At least 6 characters.' }}

Enter your email and we'll send a link to set a new password.

{{ auth.error }}

{{ auth.notice }}

Post to LinkedIn

This is exactly what will appear on your LinkedIn profile. Nothing is posted until you press Post now.

{{ ((li.preview && li.preview.name) || 'You').charAt(0).toUpperCase() }}

{{ (li.preview && li.preview.name) || 'You' }}

Public post, from your own LinkedIn profile

{{ li.preview ? li.preview.text : (li.draft && li.draft.content) }}

Text only: the image on this draft is not attached.

{{ li.preview.chars }} of 3,000 characters

{{ li.notice }}

Loading the preview…

{{ li.error }}

Posted as you, from your own LinkedIn profile. FoxPlug never posts on its own or on a schedule.

{{ projects.length }}/{{ projectCap }}
Voice:
Launch stage:
Nothing posts itself

{{ banner }}

You're on {{ planLabel }} — nice. 🎉

A few things worth setting up now to get the most out of it:

  • 1. Run another product from the same place — your {{ planLabel }} plan includes {{ projectCap }} project{{ projectCap === 1 ? '' : 's' }}.
  • {{ atProjectCap ? '1' : '2' }}. Set up your passive, easy pipelines to massive exposure. Read more
  • {{ atProjectCap ? '2' : '3' }}. Set up your Walkthrough CTA end screen in Settings — it's per project, so each product gets its own call-to-action.

You came to make a promo video — let's set it up. Connect your project and every update you ship becomes ready-to-post content: branded image cards and platform-tailored text now, with narrated videos and GIFs rolling out to you first.

What are you building in?

Pick where you write your code. FoxPlug works with all of them — your code already lives on GitHub, and we turn every push into your story.

{{ buildToolBridgeLine }}

Read-only access to your code. Your access is encrypted at rest — we never store it in plain text and never write to your repos.

What do you build with?

Optional — it helps us decide what to integrate next.

Or set up by pasting your product address instead

No GitHub yet? You can paste your product address and we'll read your page to fill in the rest — then connect your code any time in Settings.

Let's get FoxPlug telling your story

{{ WIZARD_STEPS[wizardStep - 1].blurb }}

Step {{ wizardStep }}/4

Paste your product URL

We'll read your page and fill in the rest — name, one-liner, logo and brand colour. Everything stays editable, and you can skip straight to typing it yourself.

{{ wizardDetectNote }}

Prefilled from your page Review and edit anything below.
Detected logo {{ wizard.logo_url ? 'Logo' : '' }}{{ wizard.logo_url && wizard.brand_color ? ' + ' : '' }}{{ wizard.brand_color ? ('brand colour ' + wizard.brand_color) : '' }} detected.

Looks like you publish on {{ platformLabel(wizard.blog_platform) }}. We've preselected {{ destinationLabel(wizard.publish_destination) }} as your publish destination — change it any time in Drafts. We'll remember this as a hint for where to publish.

  • “{{ ex }}”

Pulling your brand…

Got your logo and colors ✓

Where do you post?

Add the places you share updates and we'll pre-fill your promos later. Optional — skip any you don't use.

Your promo power

{{ completenessMeter.pct }}%

The more you connect, the more we can make for you. This never affects your free launch video.

{{ u.done ? '✓' : '○' }} {{ u.label }} {{ u.need }} Unlocked

What's your stack?

Pick the tools you build with. We'll only show you the connectors that matter — and use the rest to decide what to build next.

Connect one to begin

Connect a tool and we'll pull your real work in and write the first post on it. You can do this in Settings any time too.

{{ t.name }} Connected ✓

{{ t.scopeHint }}

{{ ITOK_EXISTING_ONLY_NOTE[t.itok] }}

Coming soon for your stack — we know you want these

{{ t.name }} · soon

No tools picked. You can connect a tool in Settings whenever you're ready — or skip ahead and see a sample.

Already have a changelog? We'll pull it in.

Paste your changelog or blog address. We fetch your past entries and add them as history, so your first posts already know your story. WordPress: add /feed. Ghost: add /rss. Substack: add /feed. Not sure? Just paste the page address.

{{ changelogImportResult.text }}

Let's find your first story

Connect your repo and we'll turn what you've already shipped into ready-to-post updates. Paste a public repo — no token needed.

Checking…

✓ {{ firstRun.check.repo }} · {{ firstRun.check.commits }} recent commits

✓ {{ firstRun.check.repo }} — but no commits in the last 30 days, so there'd be nothing to write up yet.

{{ firstRun.check.error }}

{{ firstRun.msg }}

Private repo?

We only read. Nothing is posted — every draft lands in your queue for you to read first.

How this works

We find your project's advancements and make posts, videos, and images for you to share. Nothing ever posts itself — everything's yours to use.

Choose your voice

By default your posts read “I just released the…”. Switch to “we” if you'd rather they sound like something your team accomplished.

▶ YouTube connection needs re-authorization

Auto-upload to the FoxSaaS YouTube channel is paused — the access token has expired (these are Testing-mode tokens and lapse about weekly, this is expected).

Fix: re-run the YouTube OAuth consent for the FoxSaaS channel and paste a fresh YOUTUBE_REFRESH_TOKEN into the Supabase Edge Function secrets. New promos still render, get their /v/ page and GIF, and post — they just won't have a YouTube link until this is renewed. Last checked {{ youtubeHealth.checked_at }}.

Get the most out of FoxPlug

Let us turn your breakthroughs into visual updates — images, GIFs, even promo clips. Add Pinterest, TikTok, or Instagram (personal or business) in Settings so we know where to make them for.

Get your first post out

Four steps from here to a published update. Each ticks off on its own as you go.

{{ obDoneCount }}/4
  1. ✓{{ s.n }} {{ s.label }}

All four done — you're shipping.

Setup {{ obDoneCount }}/4 · next: {{ (onboardingSteps.find(s => !s.done) || {}).label }} · all done

Quick — what's your product called?

We'll use this in your posts so the first draft sounds like your product, not your repo.

Your kit is saved 🎉

{{ (giftFirstRun.kit && giftFirstRun.kit.product_name) || 'Your' }} launch kit

Your story GIF

Want this on every release? One step and FoxPlug auto-generates a kit each time you ship.

1 · Generate your first kit

Paste your product's site — FoxPlug builds your launch kit now.

{{ giftFirstRun.gift_lead === 'gif' ? '2' : '1' }} · Auto-generate on every release

Connect GitHub (or your changelog) — each update you ship becomes a kit automatically.

{{ githubConnectMsg }}

Today

You said yes to {{ approvedUnsent.length === 1 ? 'this' : 'these' }} — {{ approvedUnsent.length }} not sent yet

{{ approvedBand(ad).line }}

{{ displayContent(ad) }}

{{ postPlatformLabel(plat) }} Open {{ postPlatformLabel(plat) }} ↗
Share this
Do this next

{{ todayNext.headline }}

{{ todayNext.why }}

{{ approvedUnsent.length }} you approved · FoxPlug has written {{ neverTouchedCount }} more, {{ freshCount }} recent {{ freshCount === 1 ? 'win' : 'wins' }}, {{ studioSignals.stale }} going stale.

The rule: a post FoxPlug wrote more than 30 days ago that has not been sent comes off the queue. The text is untouched and any of them can go back.

Nothing retired to show.

{{ r.content }}

What the numbers are asking

{{ newSurfaceById('board.diagnosis.v1').label }}

{{ diagTop.question }}

{{ diagTop.because }}

{{ fig.value }}

{{ fig.label }}

{{ fig.window }}{{ fig.scope.label }}

{{ diagTop.figures.find(f => !f.scope.site).scope.note }}

That was the only thing your figures raised.

{{ fnd.question }}

{{ fig.value }} {{ fig.label }}{{ fig.scope.label }} ·

Nothing to ask yet — no figures have come in.

Connected, but nothing pulled yet: {{ diagMissing.connectedButNoFigures.join(', ') }}.

No analytics source is connected for this domain yet.

Not connected: ,

What's worth sharing

Plan & Drift

How {{ (activeProject && activeProject.name) || 'this project' }} is tracking against its plan.

Current plan

No plan set for this project yet.

No drift check yet.