{{ 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.

{{ foxsense.offer.title }}

{{ foxsense.offer.actionText }}

Writing it now…

{{ foxsense.offer.error }}

Saved copy

What do you want to do?

Studios — make something

{{ studioSignals.short }} ready

Short Form

One update → a post or thread. Pick a format, generate, edit & post.

{{ studioSignals.video }} ready

Video Studio

Promo + launch films, every ratio.

{{ studioSignals.image }} ready

Image Studio

Shareable images from a win or a Library image.

{{ studioSignals.gif }} ready

GIF Studio

Looping GIFs from images or a video's ending.

{{ studioSignals.sticker }} ready

Sticker Studio

Transparent stickers for Giphy, iMessage, Slack.

{{ studioSignals.long }} ready

Longform

One update → a full long-form article.

Changelog

Write release notes → your public changelog.

Get it out

This moment looks press-worthy — pitch it?

The moment · {{ pressCardTypeLabel(pressWorthyMilestone) }}

{{ milestoneHeadline(pressWorthyMilestone) || pressWorthyMilestone.title }}

{{ pressCardSubline(pressWorthyMilestone) }}

Weekly shipped pages you follow

{{ currentShareView.title }}

{{ currentShareView.tip }}

{{ itemBig(m) ? 'Big' : 'Small' }} {{ itemAgeDays(m) === 0 ? 'today' : itemAgeDays(m) + 'd old' }} {{ itemArchiveDays(m) }}d to archive Shared ×{{ m.share_count }}

{{ milestoneHeadline(m) }}

{{ m.why_it_matters || m.description }}

{{ marketingScore(m).score }} {{ marketingScore(m).verdict }}
{{ r }}
{{ tierMeta(m).label }} Suggested: {{ recommendedPiecesLabel(m) }} Your call

{{ m.why_it_matters }}

How this scored Final {{ m.significance_score }}
Make it: Working…

▶ Video ready — open page · also in your Studio

Still rendering — it'll appear in your Studio shortly.

{{ visualMsg[m.id] }}

Text

Visual

Threads

{{ formatDecline(m).headline }}

{{ formatDecline(m).reason }}

Got it — we'll show fewer like this.

Today

{{ todaySummary }}

Your next moves for {{ (activeProject && activeProject.name) || 'this project' }}.

Log a win

Shipped something, or hit a milestone we can't see from your code — a first paying customer, a press mention? Log it in your own words.

🧭 Coach

{{ coach.insight }}

Reach

{{ reachStats.data.embed_loads.last_30d }} / {{ reachStats.data.embed_loads.all_time }}

GIF-widget loads

{{ reachStats.data.sig_loads.last_30d }} / {{ reachStats.data.sig_loads.all_time }}

Email-signature views

{{ reachStats.data.build_views.last_30d }} / {{ reachStats.data.build_views.all_time }}

Build-log views

{{ reachStats.data.gifs_made }}

GIFs made

{{ reachStats.data.stickers_made }}

Stickers made

{{ reachStats.data.changelog_impressions }}

Changelog impressions

Where two numbers show: last 30 days / all time.

Connect your repo to unlock

Your GitHub or GitLab repo is the ship/commit signal we turn into posts, images and more. Connect one and your shipped work starts flowing in — until then there's nothing for us to turn into content.

You're caught up 🎉

Ship something and it'll show up here, ready to share.

Share to your channels

Push a recent ship into your connected chat.

{{ milestoneHeadline(m) }}
{{ shipPostMsg[m.id] }}

Finish setting up distribution {{ distributionRemaining }} left

Connect what feeds each output — we only suggest what we can actually deliver for you.

{{ c.label }}

{{ c.names }}

{{ c.why }}

Connected ✓

Captures

Moments from your work that may be worth sharing.

You're connected — nothing new to share since we last checked your work.

You're connected — pull your work in to get started.

As soon as you ship something new, it shows up here on its own. You don't have to do anything.

A tool is connected. Open Settings and click Pull in latest to bring your recent work in.

Nothing here yet

Captures are the moments from your work that may be worth sharing — pulled in from the tools you build with, or added by hand. Connect a tool in Settings to fill this in.

{{ c.raw_text }}

{{ humanize(c.source) }} · {{ fmt(c.captured_at) }}

{{ c.processed ? 'Used' : 'Waiting' }}

Milestones

Captures rolled up into stories worth telling. Turn one into a short post, or group several into a long-form story.

No milestones in {{ (activeProject && activeProject.name) || 'this project' }} yet

Milestones are your captures grouped into stories worth telling. They appear on their own as new work comes in — we check every 15 minutes. Connect a tool or add a capture to get the first one.

Ready to share on your visual platforms
Add a visual platform Save image

Distribute this ship — {{ milestoneHeadline(m) }}

{{ a.label }} ({{ a.handle }})

{{ platformCaption(m, a.key) }}

Finding hashtags…
{{ tag }}

Your channels

{{ shipPostMsg[m.id] }}
Connect Discord/Slack first →

Get discovered on Giphy

Writing your title, tags and description…

Add a little more detail to this milestone and .

What people type into the GIF box in Slack, Discord, Facebook — not hashtags.

{{ tag }}

Paste this as the GIF's source link so every use sends people to your site.

Download your GIF, open an uploader, and paste the title, tags, and source link.

Writing your Short title, description and tags…

Add a little more detail to this milestone and .

YouTube Short

Upload the GIF, paste your Source URL, and add these tags — that's how it gets found on Giphy and carries your link.

1. Create an account at https://giphy.com/join ↗ (use your work email/domain if you can).

2. Add your logo, a short bio, and your website.

3. Upload 5 GIFs first — Giphy wants to see real content before it lists your channel.

4. Apply for a Brand Channel: https://support.giphy.com/hc/en-us/articles/360019977992-Apply-For-A-Brand-Channel ↗

5. Giphy's review takes a few days (sometimes up to two weeks). Until it's live, your GIFs won't appear in anyone's GIF picker.

6. Per GIF: paste the title, up to 20 tags (we provide them), and your website as the Source URL. New uploads can take up to 24h to show in search.

Specs we already match: loops, under 15s, under 8MB, 480p. (Stickers need a transparent background — coming soon.)

Writing venue-tailored posts…

Couldn't write the posts — add a little more detail and .

Open ↗

{{ milestoneHeadline(m) }}

{{ milestoneSubtitle(m) }}

{{ m.title }}

{{ m.description }}

Call: {{ milestoneCall(m).label }} your call provisional Re-routing…

{{ m.why_it_matters }}

Not worth a post on its own — bump it up if it actually matters.

{{ formatChoice(m).isHeld ? formatChoice(m).label : 'Best shown as: ' + formatChoice(m).label }}

✍️ This looks significant — want a long-form write-up too?

Here's what I could write:

{{ longFormSuggestion(m).title }}

  • {{ b }}

Primed ✓ — open your product and click your Record bookmarklet to start (titled “{{ walkthroughPrime.title || 'your walkthrough' }}”).

🎬 You shipped something — make a walkthrough of it?

Upgrade for more walkthroughs

📎 Lands better with a screenshot or metric — attach one

No assets in this project yet — use “Upload new”, or add some in Settings → Assets.

Attached proof

Image attached — this post is image-primary.

Not a visual moment — visuals land for launches, big milestones, striking numbers, or a new look, not routine ships and fixes.

Send to chat

{{ shipPostMsg[m.id] }}

Get Press

Match your latest milestone to the outlets most worth pitching — for {{ (activeProject && activeProject.name) || 'your project' }} — bloggers and podcasters first, journalists when you've got a bigger hook. Every pitch is a draft you review and send yourself. Or answer inbound requests from journalists looking for sources right now.

These are journalists asking for sources right now. Matches for your beats lead the list, then the soonest deadlines. Answer one before it closes — you draft the reply, we never send it for you.

{{ getPress.inbound.error }}

No open requests right now

New journalist requests come in daily once your press-request subscriptions are confirmed. Check back tomorrow, or widen your beats above to catch more.

{{ getPress.inbound.items.length }} open request{{ getPress.inbound.items.length === 1 ? '' : 's' }} — matches for your beats first, then soonest deadline. Each reply is a draft for you to review.

{{ r.journalist_name || 'A journalist' }} 🎯 Your beat

{{ r.outlet }} · {{ r.beat }}

⏳ {{ inboundDeadlineLabel(r.deadline) }} {{ inboundSourceLabel(r.source) }}

{{ r.query_text }}

✉ {{ r.reply_email }}
You review and send it yourself — FoxPlug never replies on your behalf.

Tap Refresh requests to load the open requests journalists have posted. New ones arrive daily once your subscriptions are confirmed.

Reading your site to understand your project…

🔎 {{ getPress.outlets.beats.summary }}

Add a beat below to get started.
{{ stageBannerText() }}

{{ getPress.outlets.error }}

📝 Bloggers & newsletters · {{ reachableCount('bloggers') }} reachable

We're still building this list for your beats — to seed it. We never show outlets we can't actually reach.

{{ row.outlet || 'Blog' }} · {{ row.name }}

Receptive 🎙️ also a podcast ✉ {{ row.channel }} 🏆 win ✓ pitched
Open their form ↗ no channel yet

🎙️ Podcasters · {{ reachableCount('podcasters') }} reachable

We're still building this list for your beats — to seed it. We never show shows we can't actually reach.

{{ row.outlet || 'Show' }} · {{ row.name }}

Open for guests 📝 also a blog ✉ {{ row.channel }} 🏆 win ✓ pitched
Open their form ↗ no channel yet

📰 Journalists · {{ reachableCount('journalists') }} reachable

Land 2 wins with bloggers or podcasters to unlock. They say yes fastest — a couple of wins builds the track record journalists look for. ({{ getPress.outlets.progress.wins }} of 2)

We're still building this list for your beats — . We never show journalists we don't actually have.

{{ row.outlet || 'Outlet' }} · {{ row.name }}

✉ {{ row.email }} 🏆 win ✓ pitched
no email yet

Embargoed pitch

To {{ (getPress.press.pitch.jrn && getPress.press.pitch.jrn.name) || 'the journalist' }} · {{ getPress.press.pitch.jrn.outlet }}

🔒 Marked embargoed. Preview only — FoxPlug never sends. Copy it or open it in your own mail app.

✉ Draft in email

Opens your own mail app — nothing is sent from FoxPlug.

Draft your reply

To {{ (getPress.reply.req && getPress.reply.req.journalist_name) || 'the journalist' }} · {{ getPress.reply.req.outlet }}

🔒 Preview only. FoxPlug never sends — copy this or open it in your own mail app and send it yourself.

✉ Draft in email

Opens your own mail app — nothing is sent from FoxPlug.

Draft your pitch

To {{ (getPress.outlets.pitch.row && (getPress.outlets.pitch.row.outlet || getPress.outlets.pitch.row.name)) || 'this outlet' }} · {{ getPress.outlets.pitch.tier }}

🔒 Preview only. FoxPlug never sends — copy this, or open the outlet's form / your mail app and send it yourself.

Drafting your pitch…

Add a {{ getPress.outlets.add.tier }} you know

Adds to the shared FoxPlug list — it helps every founder here (and you).

Added to the shared FoxPlug list — helps every founder here.

{{ getPress.outlets.add.error }}

We verify any email before storing.

Log a win 🏆

{{ getPress.outlets.win.row.outlet || getPress.outlets.win.row.name || 'this outlet' }}

{{ getPress.outlets.win.result }}

A win needs a public link that mentions your project. We verify it, then it counts toward unlocking Journalists.

Paste the link to the published post / episode / article.

{{ getPress.outlets.win.error }}

Drafts

One click sends you straight to X or LinkedIn with your post ready to go. Connected channels can post on their own. Nothing ever goes out until you click.

Make a video for any site

Paste a company's web address and we'll make a short, branded teaser about them — a warm way to open outreach. You get a link to send that plays with their own call-to-action.

{{ prospectAd.error }}

{{ prospectAd.message || ('Tell us what ' + (prospectAd.name || 'they') + ' does and we’ll make the video.') }}

Making your video{{ prospectAd.name ? (' for ' + prospectAd.name) : '' }}…

This takes a moment — it'll appear right here when it's ready. No need to wait around.

Ready to send{{ prospectAd.name ? (' — ' + prospectAd.name) : '' }}

Open page

What to offer them

{{ lure.reason }}

This is the safe default, not a recommendation — answer the two questions in your kit and it moves on its own.

{{ t.tier }} {{ t.label }} Proposed
  • · {{ c }}

{{ t.why_not }}

Not available

Why not {{ lure.declining.label }}? It is more useful to us than the choice would have been.

Your message, before it goes anywhere

Nothing sends on its own. Edit any of it, then save and copy — it is written to your outreach log first.

{{ lure.sendNote }}

Saved to your outreach log, under this project. Paste it into your own mail when you are ready.

Handed over and opened in a new tab. {{ lure.foundAt }}

Your prospect videos

{{ videoTitle(v) }}

{{ videoDate(v) }}

Open page Share to X Share to LinkedIn Download
✓

{{ generatedNotice }}

It's highlighted below. Review it, then click Looks good to choose where it goes — nothing is posted until you do.

No drafts in {{ (activeProject && activeProject.name) || 'this project' }} yet

Drafts are ready-to-post updates written from your milestones. Open a milestone and generate a post, then edit, copy and publish it here.

Milestone

{{ groupHeadline(g) }}

{{ groupCountLabel(g) }}

{{ g.drafts.length }} platform{{ g.drafts.length === 1 ? '' : 's' }}

Text

Visual

Threads

Showing the {{ platMeta((activeDraft(g) || {}).primary_platform).label }} version
Page {{ draftPage + 1 }} / {{ draftGroupPageCount }}

We turned your shipped work into posts.

Review, tweak, post — from your own profile, one click each.

This week's progress ({{ weekMilestones.length }} milestone{{ weekMilestones.length === 1 ? '' : 's' }})

  • •{{ milestoneHeadline(m) }}

No milestones in the last 7 days yet — connect a tool to start.

Latest digest score: {{ latestDigest.score }} · {{ digestTrend() }}

Per-platform posts are a Pro feature

Free includes the weekly digest above. Pro turns every milestone into ready-to-post LinkedIn, X, and blog drafts with one-click self-posting.

See Pro

Brand Kit {{ (activeProject && activeProject.name) || 'This project' }}

Your logo, colours, fonts and voice — used across every video for this project. Switch the active project at the top to set up another.

Loading…
Set up your brand kit — pull from your domain or upload your logo below, then pick a voice. It's used across every video for this project.

Pull from my domain

We fetch your logo and pull a colour palette from it automatically. Anything you've set by hand is left untouched.

Logo

Upload a light-background and a dark-background version. We pull your colours from the light one.

Light logo No light logo yet
Dark logo No dark logo yet

Company colours

Auto-filled from your logo — tweak any swatch. Used for captions, callouts and the endcard.

{{ sw.role }}

Ad palette

A separate palette just for ads — starts from your company colours, change any swatch to make ads pop without touching your brand kit.

{{ sw.role }}

Fonts

A display font for headlines and a body font for everything else.

Every video is white-label — only your brand shows, never FoxPlug.

{{ brandKitMsg }}

Make an Ad

A short, scroll-stopping promo — only your brand on screen. Everything's pre-filled; the simple screen alone is shippable.

Style

Format

Length

Advanced

{{ (ad.hook_text||'').length >= 80 ? 'Max length reached — 80 characters.' : ((80 - (ad.hook_text||'').length) + ' characters left (max 80).') }}

Endcard

Uses your brand kit only. If your logo is missing it simply shows nothing.

{{ ad.msg }}

Create a Walkthrough

A guided product tour. Pick a style and go — voice and language come from your brand kit. Or generate from your URL →

Style

{{ (createVid.site || '').trim() ? ('Titles the intro: “A walkthrough of ' + createVid.site.trim() + '”.') : 'Blank → the intro just says “A walkthrough”. Type the site you\'re recording to name it.' }}

Every walkthrough is white-label — only your brand, never FoxPlug. You'll add narration (optional) after recording.

{{ createVid.msg }}

You'll pick which tab to demo, then get a 5-second countdown to switch to it. Pause, add callouts and finish from the floating controls.

Image / Animation Studio

{{ allVisuals.length }} made

Make images and GIFs from your breakthroughs, then post them in one tap.

New visual

Pick a milestone, choose an image or animation, and we'll make it.

Add a visual platform to unlock the studio

Sticker pack (Stipop)

A branded reaction pack — ~24 transparent animated stickers from real founder moments, ready for the Stipop keyboard.

Your latest pack — {{ stickerPack.latest.sticker_urls.length }} stickers

Upload to Stipop (one-time):

A pack needs 10–30 stickers (PNG or GIF, transparent). Open https://studio.stipop.io ↗, create a pack, drag all the stickers in, add one bulk tag for the pack, then a few per-sticker tags (the caption words work), and submit for review. Once it's accepted it appears in the Stipop sticker picker.

Embed your latest ship

Drop this on your site — it auto-updates to your newest GIF or sticker, linked to your build log.

The embeddable widget is a Serial feature.

Email signature

An image for your email signature that always shows your newest sticker.

The email-signature image is a Serial feature.

No images or GIFs yet

No visuals yet — hit "Make an image" above or on any breakthrough and it'll appear here.

{{ v.title }}

{{ gifMeta[v.id] && gifMeta[v.id].loading ? 'Writing title, tags, description…' : 'Loading…' }}

Add a little more detail to this milestone and .

Giphy GIF

{{ gifMeta[v.id].title }}

{{ tag }}

Source: {{ ctaLink() || 'add your site in Settings' }}

Giphy Sticker

YouTube Short

Writing Short details… Add a little more detail and .

Make a video — two ways

Pick one. Both render in every ratio your channels need.

Generate a promo video

A short promo from one shipped milestone, or a 30-second product launch video from several — rendered in every ratio your channels need.

Add a visual platform to unlock the Video Studio

{{ v.title }}

Save video

Your videos

Your videos now live in your Library

Generate above — then watch, download and share every video (alongside your GIFs, stickers and more) in your .

Your assets

The raw materials — brand, images and sound — we draw from to make your videos and posts.

Brand

Your logo
Font: {{ materialFont }}

No brand kit yet — add your site in Settings and we'll pull your logo, colours and font, or set them in the tab.

Your words — reused in your posts

“{{ w }}”

Uploads

{{ (activeProject && activeProject.name) || 'This project' }}

Your logo, screenshots and brand images for {{ (activeProject && activeProject.name) || 'this project' }}. Attach one to a milestone to make a post image-primary — it lands far better with a picture or a metric.

Detected logo

We found your logo

Add it to your library so it's ready to attach to posts.

A description is incredibly important — it gives us the context to craft better videos, images, and GIFs for you.

  • {{ u.name }} uploading… added {{ u.error }}
{{ assetKindLabel(a.kind) }} {{ a.meta.aspect }} Add description

No uploads in {{ (activeProject && activeProject.name) || 'this project' }} yet. Upload a screenshot or import your logo above.

Sound

Background music, narration voice and language we use on your videos.

Nothing set yet. Choose a default voice, language and music for this project in the tab, or pick per-video options when you generate in the Library.

Looking for badges, feeds and cross-posting? They live in the tab.

Library

Things you keep on purpose — your company story, repurposing and inspiration — plus everything that has aged out of your active wins or already been shared.

Campaign No campaigns yet — group items with the campaign picker on any card below.

Saved videos

Nothing saved yet — save a walkthrough or launch video from its download and it lands here.

{{ v.title || 'Saved video' }}

Images

No images here{{ libCampaign ? ' in this campaign' : ' yet' }}.

{{ milestoneHeadline(m) }}

Open ↗

GIFs

No GIFs here{{ libCampaign ? ' in this campaign' : ' yet' }}.

{{ milestoneHeadline(m) }}

Open ↗

Stickers

No stickers here{{ libCampaign ? ' in this campaign' : ' yet' }}.

{{ milestoneHeadline(m) }}

Open ↗

Videos

No videos here{{ libCampaign ? ' in this campaign' : ' yet' }}.

{{ milestoneHeadline(m) }}

Open ↗

Walkthroughs & launch videos

{{ videoTitle(v) }}

{{ videoDate(v) }}

Download

Short-form

No short-form content here{{ libCampaign ? ' in this campaign' : ' yet' }}.

{{ milestoneHeadline(m) }}

{{ m.description || m.why_it_matters }}

Long-form

No long-form content here{{ libCampaign ? ' in this campaign' : ' yet' }}.

{{ milestoneHeadline(m) }}

{{ m.description || m.why_it_matters }}

Saved

Nothing saved yet. Soon you'll be able to keep a win here for your company story, to repurpose, or for inspiration.

Archive

{{ archivedItems.length }}

Auto-archived after they age out — small wins after 5 days, major milestones after 15 — and anything you've shared lands here too.

Nothing archived yet — shared and aged-out wins will collect here.
{{ itemBig(m) ? 'Big' : 'Small' }}

{{ milestoneHeadline(m) }}

{{ m.why_it_matters || m.description }}

{{ itemAgeDays(m) }}d old Shared{{ m.share_count ? ' ×' + m.share_count : '' }} Aged out

Infiltrate

Distribution

Get your ships in front of more people, in more places — set up the doors that fit {{ (activeProject && activeProject.name) || 'this project' }}.

Changelog

Write a release note and publish it to your public changelog page. Nothing goes public until you press Publish.

This project has no public address yet, so there's nowhere to publish. Add one in first.

Your public page: {{ changelogPageUrl }} ↗

Import my existing changelog

Already keep release notes somewhere? We'll read them and bring them in as drafts. Nothing goes public — you keep the ones you want and delete the rest.

{{ clImportResult.text }}

{{ clImported.length }} imported entr{{ clImported.length === 1 ? 'y is' : 'ies are' }} waiting below — none of them are public.

Build it from what you've already shipped

Your milestones are already captured and scored. We'll draft release notes from the ones worth talking about — you read them, tick the ones you want, and publish those. Nothing is published until you do.

{{ clBf.error }}

{{ clBfChosen().length }} of {{ clBf.proposals.length }} chosen

Nothing on this list is public until you press that button.

Make it yours

Pro

Newsletter

Pro

Turn what you published into a newsletter and drop it into your email tool as a draft. You read it and press send there — FoxPlug never sends to your list.

Subject

{{ nlDraft.subject }}

No email tool connected yet — add one in , or use copy-and-paste.

Open the draft ↗

{{ nlExportHtml.slice(0, 1200) }}…

{{ nlMsg }}

{{ clForm.id ? 'Edit entry' : 'New entry' }}

Pick at least one plan, or this entry reaches nobody but you.

{{ clMsg }}