Domains
{{ projects.length }}/{{ projectCap }} used on your {{ planLabel }} plan Β· {{ paidExtraDomains }} add-on{{ paidExtraDomains === 1 ? '' : 's' }} (${{ paidExtraDomains * 15 }}/mo)
{{ p.url || 'No URL set' }}
Preparing brand kitβ¦
{{ projects.length }} of {{ projectCap }} domain{{ 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 Broadcast' : "You're at your domain limit" }}
{{ currentPlan === 'free' ? 'Your Free plan includes 1 domain. Upgrade to add this domain.' : ('Your ' + planLabel + ' plan includes ' + projectCap + ' domain' + (projectCap === 1 ? '' : 's') + '. Upgrade to a plan with more.') }}
Billed by Stripe. Manage or cancel any time in Settings β Subscription.
This is your {{ ordinal(projects.length + 1) }} domain
Your {{ planLabel }} plan includes {{ planBaseDomains }} domain{{ planBaseDomains === 1 ? '' : 's' }}. Adding this one is an extra-domain 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 domain later and the add-on decrements automatically.
Choose a new password for your account.
{{ auth.error }}
{{ auth.notice }}
Your build-in-public sidekick.
{{ auth.error }}
{{ auth.notice }}
{{ banner }}
You're on {{ planLabel }} β nice. π
A few things worth setting up now to get the most out of it:
You've reached your project limit
The {{ planLabel }} plan includes {{ projectCap }} project{{ projectCap === 1 ? '' : 's' }}. Upgrade to run more products from one place.
Add a project
Each project is its own product β its milestones, drafts and posts stay separate and every post is grounded in that product.
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.
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 }}
One-click GitHub connect is being switched on. For now you can set your product up just below.
{{ githubConnectMsg }}
{{ gitlabConnectMsg }}
{{ bitbucketConnectMsg }}
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.
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.
{{ WIZARD_STEPS[wizardStep - 1].blurb }}
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 }}
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.
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.
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.scopeHint }}
Coming soon for your stack β we know you want these
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 }}
Here's FoxPlug on your work Sample
This is a sample so you can see the shape of it. Connect a tool in Settings and your real milestones replace it.
We turned your shipped work into your first post. Review and use it in Drafts whenever you're ready.
Milestone
{{ payoffMilestone.title }}
{{ payoffMilestone.description }}
Draft post
{{ payoffDraftText }}
You're set up
Connect a tool and your first milestone β with a post waiting on it β shows up in Drafts.
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.
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 }}.
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.
Four steps from here to a published update. Each ticks off on its own as you go.
All four done β you're shipping.
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 π
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 }}
Unshared wins about to age out β share before they're old news.
One update β a post or thread. Pick a format, generate, edit & post.
Send a finished post to every platform at once β plus your GitHub badge and build log.
Your big shipped moments β prep & share far and wide.
Saved assets & aged-out wins to repurpose.
Promo + launch films, every ratio.
Shareable images from a win or a Library image.
Looping GIFs from images or a video's ending.
Transparent stickers for Giphy, iMessage, Slack.
One update β a full long-form article.
{{ currentShareView.tip }}
Connect a source or log a win to begin.
You're shipping β nothing's risen to share-worthy yet. Keep going; we'll glow a card the moment something does.
{{ projectProgressLine }}
{{ milestoneHeadline(m) }}
{{ m.why_it_matters || m.description }}
βΆ Video ready β open page Β· also in your Studio
Still rendering β it'll appear in your Studio shortly.
{{ visualMsg[m.id] }}
Text
Visual
Threads
GIFs are a Broadcast feature
Turn your work into branded looping GIFs β from an image, a few images, or a video's ending β ready to share to the GIF networks behind Slack, Discord, Facebook, and iMessage, so people see your product again and again before they ever reach your site.
Broadcast also gives you:
Make a {{ pickerNoun }} β pick a source.
From your Library
β none yet
From a visual-worthy win
β none yet
{{ projectHasMilestones ? 'Nothing here yet β add an image or clip in your Library, or ship a launch / milestone.' : 'No wins logged yet in this project. Add an asset in your Library, or log a win.' }}
GIF Studio
Turn an image into a typewriter-caption GIF for the pickers in X, Slack, Discord & more.
Source
No source yet β make a GIF from a video ending or a Library image.
β¦or pick one you own
{{ gifStudio.caption.length >= 24 ? 'Max length reached β 24 characters.' : ((24 - gifStudio.caption.length) + ' characters left (max 24).') }}
Every account gets the same 20-tag limit β checking this does not change the count. What verification changes is REACH: only verified Brand/Artist channels get indexed in GIPHY's own search and the Facebook, Instagram & WhatsApp GIF pickers. Apply for a GIPHY channel β
Tags appear here automatically once you render the GIF β then add or remove any.
{{ gifTagWarning }}
GIPHY hard-caps tags at 20 β 10-15 accurate ones work best; padding to the max can hurt reach (GIPHY demotes GIFs shown on searches they don't match). Tags upload the same for any account; a verified channel is what gets the GIF indexed in GIPHY search + the Facebook, Instagram & WhatsApp pickers.
Preview
Image Studio
Make a clean, branded card β a metric or milestone that looks valuable, in every ratio your channels need.
Source (optional β text-only works too)
β¦or pick one you own
{{ imageStudio2.useBranding ? ('On β your logo + colours from ' + ((activeProject && activeProject.name) || 'your domain') + '.') : 'Off β neutral style, no brand logo or colours.' }}
{{ imageStudio2.headline.length >= 48 ? 'Max length reached β 48 characters.' : ((48 - imageStudio2.headline.length) + ' characters left (max 48).') }}
{{ imageStudio2.subline.length >= 80 ? 'Max length reached β 80 characters.' : ((80 - imageStudio2.subline.length) + ' characters left (max 80).') }}
{{ imageStudio2.altText.length >= 120 ? 'Max length reached β 120 characters.' : ((120 - imageStudio2.altText.length) + ' characters left (max 120).') }}
{{ imageStudio2.error }}
Preview
Sticker Studio
A punchy transparent sticker from your image or logo β for the pickers in Slack, Discord, iMessage & Giphy.
Source
β¦or pick one you own
Tip: a transparent PNG or logo gives the cleanest sticker. Background removal lands in a later version.
{{ stickerStudio.caption.length >= 16 ? 'Max length reached β 16 characters.' : ((16 - stickerStudio.caption.length) + ' characters left (max 16).') }}
Tags appear here automatically once you render the sticker β then add or remove any.
{{ stickerTagWarning }}
GIPHY: max 20 tags, ~10 recommended. Tags require a verified Brand/Artist channel to work β and for the sticker to appear in Facebook, Instagram & WhatsApp search.
Preview
Log a win
Something you shipped or achieved that we can't see from your code β a first customer, a mention, a milestone.
Win logged β
It's in your Milestones. Want to turn it into a post β in your own words?
Longform
Turn one update into a full long-form article β it lands in Drafts to edit & publish.
The article is written only from this update β your own words, notes and proof.
No updates in this project yet β log a win, or paste your own post above.
Already wrote it? Paste it here and we still handle the hard part β publishing to your main, then walking you through each reprint with the canonical tag set, so Google credits your main and the copies don't split your SEO.
Short-form posts
Turn one update into a short post or thread β then edit & use it in Drafts.
No updates in this project yet β log a win first.
Format
{{ f.label }}
{{ f.tip }}
Generated posts land in β edit, copy and post them there. Nothing posts itself.
Share this win
{{ milestoneHeadline(shareSheet) }}
{{ d.content }}
{{ foxHandle(d) }}
{{ foxChannelOf(d.primary_platform) === 'linkedin' ? 'You β’ Now' : 'now' }}
{{ d.content }}
No post written yet β close this and hit Write post first.
Video link
{{ cardState[shareSheet.id].vpage }}
Your share options
{{ optionsKit.m ? (milestoneHeadline(optionsKit.m) || optionsKit.m.title) : '' }}
Preparing your optionsβ¦
Writing your posts and making your image, GIF and sticker. The video is a separate button β it doesn't start on its own.
Visuals
Image
GIF
Sticker
{{ optionsKit.visualMsg || 'No visuals prepared for this update.' }}
Saved to your Library and attached to this update β download or refine any of them in its Studio.
Text posts
{{ d.content }}
No posts came back β add a little more detail to this update, then prepare again.
Edit & use the text in . Nothing posts itself.
{{ readyPanel.items.length }} ready to {{ readyPanel.kind === 'short' ? 'post' : 'make' }}
Pick an update β the {{ readyPanel.kind === 'short' ? 'composer' : (readyPanel.kind === 'gif' ? 'GIF Studio' : (readyPanel.kind === 'sticker' ? 'Sticker Studio' : 'Image Studio')) }} opens loaded with it.
{{ milestoneHeadline(m) || m.title }}
{{ milestoneSubtitle(m) }}
{{ todaySummary }}
Your next moves for {{ (activeProject && activeProject.name) || 'this project' }}.
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.insight }}
{{ 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.
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 }}
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) }}
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.
Distribute this ship β {{ milestoneHeadline(m) }}
{{ a.label }} ({{ a.handle }})
{{ platformCaption(m, a.key) }}
Blog cross-post
Canonical points home β search engines still credit your original; you just gain reach.
Get discovered on Giphy
Add a little more detail to this milestone and .
What people type into the GIF box in Slack, Discord, Facebook β not hashtags.
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.
Add a little more detail to this milestone and .
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.)
Couldn't write the posts β add a little more detail and .
{{ milestoneHeadline(m) }}
{{ milestoneSubtitle(m) }}
{{ m.title }}
{{ m.description }}
{{ m.why_it_matters }}
Not worth a post on its own β bump it up if it actually matters.
{{ m.format_verdict === 'do_not_post' ? formatVerdictLabel(m.format_verdict) : 'Best shown as: ' + formatVerdictLabel(m.format_verdict) }}βοΈ This looks significant β want a long-form write-up too?
Here's what I could write:
{{ longFormSuggestion(m).title }}
Primed β β open your product and click your Record bookmarklet to start (titled β{{ walkthroughPrime.title || 'your walkthrough' }}β).
π¬ You shipped something β make a walkthrough of it?
{{ walkthroughQuotaRemaining }} of {{ walkthroughQuota.cap }} walkthrough{{ walkthroughQuota.cap === 1 ? '' : 's' }} left this month. You've used your walkthroughs this month β upgrade for more.
π Lands better with a screenshot or metric β attach one
No assets in this project yet β use βUpload newβ, or add some in Settings β Assets.
Image attached β this post is image-primary.
Make visuals
{{ visualMsg[m.id] }}
Add a visual platform to unlock images & videoNot a visual moment β visuals land for launches, big milestones, striking numbers, or a new look, not routine ships and fixes.
Send to chat
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.
Hang tight β it'll appear right here when it's ready. You can keep working in the meantime.
Your sources are connected. We'll make a video about what you've already shipped.
Connect the tools that show your progress and we'll turn your shipped work into a launch video β {{ welcomeAd.connected_count }} of {{ welcomeAd.needed || 2 }} connected so far.
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.
Your prospect videos
{{ 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) }}
Text
Visual
Threads
{{ nextStepLine(d) }}
Live preview
{{ displayContent(d) }}
Last attempt: {{ targetOf(d).error }}
Where do you want it?
Nothing posts itself β everything's yours to use. Every link below is a manual copy, open or paste.
Canonical: {{ canonicalValue(d) }}
Post it β pick a destination
LinkedIn pastes manually β it dropped composer pre-fill.
{{ linkedinHint[d.id] }}
Posted it somewhere? Paste the live links.
Once any link is in, use Mark as posted above to finish.
We publish a copy with a canonical link back to your original, so search engines still credit you β you just get the extra reach and backlinks.
Cross-post, guided Β· main: {{ mainBlogLabel }}
{{ xpDoneCount(d) }} / {{ xpConnectedCount(d) }} done
Publish the original on your main ({{ mainBlogLabel }}) first, then paste its URL into Canonical home above β every reprint will point back to it.
No reprint platforms connected yet β tick the blogs you post to in and they'll queue up here in order.
All cross-posts done β β every reprint points its canonical to your main.
Next: {{ CROSSPOST_META[k].label }} β
{{ CROSSPOST_META[xpNext(d)].label }}
In {{ CROSSPOST_META[xpNext(d)].label }}'s post settings, paste this into the Canonical URL field β Google keeps crediting your main.
On Medium, use Import a story from your main's URL β Medium sets the canonical to your main for you:
{{ CROSSPOST_META[xpNext(d)].label }} can't carry a canonical tag β a full duplicate here could compete with your main. Post an excerpt + a link to your main instead (the body above is already trimmed to that).
{{ crosspostProviderLabel(prov) }}: {{ crosspostResult[d.id][prov].error }}
Want Bluesky, Mastodon or Telegram too? .
Want it on dev.to too? .
Post it yourself β prefilled where the platform allows, copy-and-paste where it doesn't
Review, tweak, post β from your own profile, one click each.
This week's progress ({{ weekMilestones.length }} milestone{{ weekMilestones.length === 1 ? '' : 's' }})
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 ProNothing to post yet
Connect a tool and generate a post from a milestone β it shows up here, ready for each platform.
{{ (d.milestone && d.milestone.title) || (d.content || '').split('\n')[0].slice(0, 70) }}
{{ p.tone }}
{{ prepFor(d, p.key) }}
LinkedIn can't fill the text in for you β copy it, open the composer, and paste.
Share to open platforms β {{ broadcastSummary(d) }}
Your logo, colours, fonts and voice β used across every video for this project. Switch the active project at the top to set up another.
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.
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.
A short, scroll-stopping promo β only your brand on screen. Everything's pre-filled; the simple screen alone is shippable.
Style
Format
Length
{{ (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.
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.
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.
{{ rec.phase==='uploading' ? 'Saving your recordingβ¦' : 'Rendering your videoβ¦' }}
{{ rec.phase==='uploading' ? 'Storing the capture securely β this stays open.' : ('Applying your style, narration & brand' + (rec.eta ? ' β about ' + recEtaLabel + ' left' : '') + '.') }}
{{ rec.renderError ? 'Your recording + text are safe β retry the render' : 'Your recording is ready π¬' }}
Add narration in your own words, or leave it blank for a clean, silent video. Nothing is ever written for you.
{{ rec.callouts.length }} callout{{ rec.callouts.length===1?'':'s' }} kept from your recording.
{{ (createVid.narration || '').trim() ? (createVid.speak ? 'Shown as captions and spoken aloud.' : 'Shown as captions (no voiceover).') : 'Blank β a clean, silent styled video (style + title + end card). No captions, no voiceover.' }}
Your walkthrough is ready π¬
Shareable page: {{ rec.result.share_url }}
This is why you record in FoxPlug β one recording becomes a whole kit. Nothing generates until you ask.
{{ rec.repurpose.error }}
GIF highlights
Stills
Sticker set
{{ rec.writeup.error }}
Tell us what you showed first
We write the {{ rec.writeup.promptFor === 'blog' ? 'blog post' : 'social posts' }} only from your own words β no invented features or claims. Add the steps you walked through:
Social posts
Recording didn't finish
{{ rec.error || 'Something went wrong.' }}
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.
Suits your connected: {{ postTargetsFor(imageStudio.kind).map(a => a.label).join(', ') || 'your channels' }}
A looping GIF from an image, a few images, or a video's ending β white-label, ends on your logo.
{{ visualMsg[imageStudio.milestone_id] }}
Add a visual platform to unlock the studioSticker 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 Broadcast feature.
Email signature
An image for your email signature that always shows your newest sticker.
Paste this into your Gmail or Outlook signature settings.
The email-signature image is a Broadcast 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 }}
Add a little more detail to this milestone and .
Giphy GIF
{{ gifMeta[v.id].title }}
Source: {{ ctaLink() || 'add your site in Settings' }}
Giphy Sticker
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.
Nothing to build a video from yet
Record a walkthrough of your product, log a win, or upload a screenshot or clip β then generate a video from it right here.
No ships logged in the last 7 days yet β your weekly recap appears once you've made progress this week.
Create a launch video for {{ (activeProject && activeProject.name) || 'your product' }}
A ~30-second launch film built from your site β no setup needed. White-label: your brand only, no FoxPlug mark.
No ships in {{ (activeProject && activeProject.name) || 'this project' }} yet β the launch builds from your site.
{{ videoStudio.launchIds.length }} selected
Music
We'll make: 9:16 for Instagram & TikTok Β· 1:1 for Instagram / LinkedIn Β· 16:9 for YouTube & LinkedIn
Promo videos are a Pro feature.
Promo videos are a Pro feature.
{{ videoStudio.error }}
{{ renderProgressLine }}
{{ v.title }}
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 .
{{ videoTitle(videoModal) }}
Share
{{ videoSharePageUrl(videoModal.share_token) }}
Paste this link where links are allowed (ProductHunt, LinkedIn, X) β it has your clickable button, tracks clicks, and shows your cover. Upload the MP4 only where links aren't allowed.
{{ reviewTitle(reviewModal) }}
Save it to your Library, copy the link, download it β or ask for changes.
The raw materials β brand, images and sound β we draw from to make your videos and posts.
Brand
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.
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.
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.
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.
Saved videos
Nothing saved yet β save a walkthrough or launch video from its download and it lands here.
Images
No images here{{ libCampaign ? ' in this campaign' : ' yet' }}.
{{ milestoneHeadline(m) }}
GIFs
No GIFs here{{ libCampaign ? ' in this campaign' : ' yet' }}.
{{ milestoneHeadline(m) }}
Stickers
No stickers here{{ libCampaign ? ' in this campaign' : ' yet' }}.
{{ milestoneHeadline(m) }}
Videos
No videos here{{ libCampaign ? ' in this campaign' : ' yet' }}.
{{ milestoneHeadline(m) }}
Walkthroughs & launch videos
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.
{{ milestoneHeadline(m) }}
{{ m.why_it_matters || m.description }}
Get your ships in front of more people, in more places β set up the doors that fit {{ (activeProject && activeProject.name) || 'this project' }}.
Put your ships on your GitHub profile
Puts a "Recently shipped" list on your GitHub profile page. Where it shows: the top of github.com/your-username β anyone who visits your profile sees your latest ships. Your GitHub may be run by a no-code tool β this is a separate, special repo just for your profile page; set it up by hand once (2 minutes).
Using your connected GitHub: @{{ githubAccountLabel }}
{{ ghReadmeSnippet }}
{{ ghProfileUsername || 'your-username' }}, choose Public, tick βAdd a README fileβ, click Create repository.
Want to refresh it later? Come back, copy again, and re-paste.
List on AlternativeTo
Lists your product on AlternativeTo. Where it shows: AlternativeTo search results when people look for "alternatives to {a tool}" β high-intent strangers discover you. We prep everything; you paste and submit.
Add a little more about your product (name, URL, one-liner) and .
This is an alternative to:
dev.to & Hashnode
Republishes your long-form posts on dev.to and Hashnode in one tap. Where it shows: your dev.to / Hashnode profile and their feeds β their readers see your write-up, with a canonical link back so your original keeps the SEO credit.
dev.to
Connected{{ crosspostConn('devto').username ? ' (@' + crosspostConn('devto').username + ')' : '' }} β Not connected{{ crosspost.devtoErr }}
Get your key: dev.to β Settings β Extensions β DEV API Keys (dev.to/settings/extensions).
Hashnode
Connected{{ crosspostConn('hashnode').username ? ' (@' + crosspostConn('hashnode').username + ')' : '' }} β Not connected{{ crosspost.hashnodeErr }}
We couldn't find a Hashnode publication on your account β create one on Hashnode first.
Get your token: Hashnode β Settings β Developer β Generate new token (hashnode.com/settings/developer).
Discord / Slack ship feed
Posts each ship straight into a Discord or Slack channel. Where it shows: the channel you pick β your community/team sees the update the moment it ships. Drop a webhook URL, no bot or code needed.
Discord
Connected β Not connected{{ webhooks.discordErr }}
In Discord: your channel β Edit Channel β Integrations β Webhooks β New Webhook β Copy Webhook URL.
Slack
Connected β Not connected{{ webhooks.slackErr }}
Create one at api.slack.com/messaging/webhooks, pick the channel, copy the URL.
RSS feed + embed widget
An always-fresh feed of your published ships. Where it shows: anywhere that reads a feed β RSS readers, Zapier automations, or embedded on your own site so visitors see your updates.
{{ feedRssUrl }}
{{ feedJsonUrl }}
{{ changelogEmbedSnippet }}
Your feed turns on once your build log is live.
βBuilding in publicβ badge
This is a small badge you paste on your site or README. It links visitors to your public build log on FoxPlug. Copy it, paste it where you want, and anyone who clicks sees your shipped updates.
The link goes to: {{ spreadBadgeUrl }}
It links to your public build log (live once you publish a changelog entry).
{{ badgeMarkdown }}
{{ badgeHtml }}
{{ spreadBadgeUrl }}
Your badge links to your build log.
Send a finished post to every platform you've connected, and put your shipped work where people already look β your GitHub profile and your public build log. Nothing posts itself; you click Post.
Where your posts can go
The open platforms you've connected. Add more in .
No open platforms connected yet. Until then, use Copy on any post and paste it wherever you like.
Cross-post a finished post
Pick a post you've made and send it to every connected platform at once.
{{ (d.content || '').slice(0, 240) }}{{ (d.content || '').length > 240 ? 'β¦' : '' }}
You don't have any finished posts yet.
βRecently shippedβ for your GitHub profile
Put your latest ships on your GitHub profile page (github.com/{{ ghUsername || 'your-username' }}) so every visitor sees you building.
Live badge β updates itself (recommended)
{{ liveBadgeMarkdown }}
Setup: on GitHub, make (or open) the special repo named exactly like your username β that repo's README shows on your profile page. Paste this line into its README.md, commit, done. It refreshes on its own as you publish new ships β no re-copying.
Or a static list (fixed snapshot)
{{ recentlyShippedMarkdown }}
Re-copy this after new ships to refresh it.
Your badge builds from your published ships.
Your public build log
Your live page of shipped updates β share the link anywhere.
{{ spreadBadgeUrl }}
Open β
Your build log goes live once you publish a changelog entry.
We pulled your logo and colours from your site β give them a quick once-over and save. This is what shows up on your videos, share pages, and end screens.
{{ brandCard.pulling ? 'Pulling your brandβ¦' : 'Loadingβ¦' }}
One moment β filling everything in for you.
Logo
Colours
{{ sw.role }}
Already have a launch video? Re-make it with the brand above.
Regenerate?Re-making your launch video⦠it'll update in your Videos tab shortly.
Founders who share daily get noticed.
Make your first share to start your streak.
{{ shareStreak.current }} day{{ shareStreak.current === 1 ? '' : 's' }}
current share streak
{{ shareStreak.weekDays }} / 7
days shared this week
Best: {{ shareStreak.best }} day{{ shareStreak.best === 1 ? '' : 's' }}
Keep your {{ shareStreak.current }}-day streak β share something today.
Channel coverage Β· last 7 days
{{ t.label }}
{{ t.total }}
{{ t.small }} small Β· {{ t.big }} big
Analytics is a Pro feature
See impressions, views, clicks, and reactions per entry. Upgrade to Pro.
See ProNo analytics yet
Publish a changelog entry, then embed the widget on your site β views, clicks and reactions on your own changelog land here.
| Entry | Views | Clicks | Reactions |
|---|---|---|---|
| {{ e.title }} | {{ e.views }} | {{ e.clicks }} | {{ e.reactions }} |
No progress digest yet
This scores what you got done over a period and writes a shareable summary. Generate one once you have a few captures and posts.
progress points Β· {{ digestTrend() }}
{{ latestDigest.metrics.held_back.nudge }}
{{ latestDigest.summary }}
{{ v[0] }}
{{ (latestDigest.audience_variants && latestDigest.audience_variants[v[1]]) || '' }}
Settings for your whole account, used across every domain.
Your promo power
{{ completenessMeter.pct }}%The more you connect, the more we can make for you. This never affects your free launch video.
Subscription
{{ billingPlanLabel(billing.plan) }}Checking your subscriptionβ¦
{{ billingPlanLabel(billing.plan) }} Β· {{ billing.status }}
Next payment: {{ billingDate(billing.current_period_end) }} Β· {{ billingAmount(billing) }}
Cancels on {{ billingDate(billing.current_period_end) }} β wonβt renew.
Billing details arenβt available right now β your plan is unaffected.
{{ billing.cancelMsg }}
Want more? Higher plans give you more domains, more videos, plus images & GIFs.
{{ ['pro','serial'].includes((billing.plan||'').toLowerCase()) ? 'See plans' : 'Upgrade' }}Connect the tools you build with and the channels you post to.
Connecting dev.to, Hashnode, Discord and Slack now lives in the tab.
Where you post
Tailors what we makeTick the places you actually post. We'll generate one native variant for each β in that platform's real voice and length. Nothing here connects an account or posts for you.
{{ g.title }}
{{ g.hint }}
Main blog
Canonical homeWhere your original long-form lives. When you cross-post, every copy's canonical points back here β so Google credits your main and never treats the reprints as duplicates.
Connectors
One-clickConnect the things you build with and your real moments turn into posts on their own. Read-only β we never change anything.
GitHub
every push β posts
Stripe
first customer β posts
Vercel
shipped β posts
GitLab
every push β posts
Bitbucket
every push β posts
Your launch & update videos live in the
Connect platforms for automatic posting
Connect dev.to, Bluesky and Mastodon so your posts go out when you click Share. What you enter is encrypted and never shown again after you save.
Connect the tools you build with
Connect a tool and we pull in the moments worth sharing β work you shipped, first payments, issues you closed β straight in as milestones, each with a post waiting. We only ever read; we never change anything. Your connection is encrypted and never shown again after you save.
{{ t.scopeHint }}
Connect {{ (CONNECT_GUIDES[t.key]||{}).name || t.name }}
Read-only β {{ t.scopeHint }}
Encrypted at rest. We run one read-only check before connecting, and never show the token again.
Connect Claude Code
Real-timeWhen a Claude Code session ends, a short scrubbed summary of what you shipped flows in β and a post is waiting on each. Only a short summary ever leaves your machine, never a full transcript, and secret-shaped text is stripped before it sends.
That's it β your work will start flowing in.
{{ ccOneLiner }}
This line carries your key and is shown only once. Copy it now.
Your keys
No keys yet. Generate one above to connect Claude Code.
{{ k.label || 'Ingest key' }}
Added {{ fmt(k.created_at) }} Β· last used {{ fmt(k.last_used_at) }}
Revoke is instant. To rotate, revoke the old key, then run Generate key again and paste the fresh line.
Connect your code on GitHub
Step 1 β start hereWe pull in your recent changes and releases, group them into milestones, and write a post for each. Connect once and every push writes a post on its own.
{{ githubConnectMsg }}
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.
One-click GitHub connect is being switched on. For now you can connect by project name just below.
{{ repoSyncResult.text }}
We remember your project, so each time only the new work since last time comes in.
Connect your payments on Stripe
Connected βYour first customer becomes a post. Connect once and every payment after writes its own post β celebrating your revenue, never the maths behind it.
Read-only access to your payments. Encrypted at rest. We run one read-only check before connecting, and never show the key again β and never move your money.
{{ stripeConnectMsg }}
Stripe is connected. Your next customer payment writes its own post.
Connect your patrons on Patreon
Connected βA new patron becomes a post. Authorise once and every new patron β and milestones like passing 50 patrons β writes its own post, celebrating the support behind your work.
Read-only access to your campaign + patrons. We never post to Patreon β it's a source only.
One-click Patreon connect is being switched on β please check back soon.
{{ patreonConnectMsg }}
Patreon is connected. Your next patron writes its own post.
Reconnect YouTube (FoxSaaS channel)
Admin {{ ytTokenLabel }} No token storedThe upload token expires every 7 days. Press this, pick the FoxSaaS Google account, and a fresh one is stored β takes seconds.
β³ Reconnect YouTube β {{ yt.tokenAgeDays >= 7 ? 'the token has expired' : ('expires in ~' + (7 - yt.tokenAgeDays) + ' day' + ((7 - yt.tokenAgeDays) === 1 ? '' : 's')) }}.
Heads up: a YOUTUBE_REFRESH_TOKEN environment variable is set on the project. The uploader reads it before the stored token, so reconnecting won't take effect until that env var is removed.
YouTube connect isn't configured yet.
{{ yt.msg }}
Connect your deploys on Vercel
Connected βWhen you ship, the world hears about it. Connect once and every production release writes its own post β celebrating that your work is live.
Read-only access to your deploys. Encrypted at rest. We run one read-only check before connecting, and never show the token again.
{{ vercelConnectMsg }}
Vercel is connected. Your next production release writes its own post.
Connect your code on GitLab
Connected βYour code on GitLab becomes your story. Connect once and every push writes its own post β celebrating what you shipped.
Read-only access to your code. Encrypted at rest. We run one read-only check before connecting, and never show the token again.
{{ gitlabConnectMsg }}
GitLab is connected. Your next push writes its own post.
Connect your code on Bitbucket
Connected βYour code on Bitbucket becomes your story. Connect once and every push writes its own post β celebrating what you shipped.
Read-only access to your code. Encrypted at rest. We run one read-only check before connecting, and never show the token again.
{{ bitbucketConnectMsg }}
Bitbucket is connected. Your next push writes its own post.
Telegram
Telegram is the one channel that can post on its own β or share to it manually like the others, your choice. Add your bot to the target channel as an admin, then paste the channel id or @username below.
Public channel: use @username. Private channel/group: use the numeric chat id (starts with -100). Leave blank and Save to disconnect.
Channels
Where your posts can go. Telegram can auto-post if you switch it on below; everything else is one-click share.
Settings just for the domain you're editing.
Product website
Your product's web address. This is the keystone β your logo, colours, and where-you-post all start from here.
{{ siteExtractMsg }}
β Verified
We couldn't find that account β check the exact spelling, or paste the profile URL from the platform.
Saved β we couldn't auto-verify this one, double-check the handle.
Video settings
How videos for {{ activeProject.name || 'this domain' }} sound. These are per-domain and save as you change them.
Saved β
{{ videoSettingsMsg }}
Posting profiles
The places you share updates. Your own profiles carry across projects; this project's accounts are pre-filled from your site where we can find them. Optional.
Already have a changelog? We'll pull it in.
HistoryPaste the web address of your changelog or blog. We fetch your past entries ourselves and add them as history β so future posts already know your product's story. You never paste entries by hand.
Where's my feed?
{{ changelogImportResult.text }}
Name each codebase
Per codebaseYou run more than one product from this project. Give each codebase its own product name and one-liner, and every post written from its work uses that β so an Acme codebase says "Acme", not the project name. Leave blank to fall back to the project name.
{{ r.repo_key }}
Labeled β
Changelog
{{ (activeProject && activeProject.name) || 'This project' }}Your "What's new" page, an embeddable widget for your own site, and an RSS feed β all scoped to {{ (activeProject && activeProject.name) || 'this project' }}. Switch the active project at the top to manage another one.
The changelog page, widget and RSS are a Pro feature
Upgrade to publish a hosted changelog, drop a whitelabel "What's new" widget on your own site, and offer an RSS feed.
See ProYour public build log
Share thisYour branded build-in-public page β every published update, your name on top. Share it anywhere.
{{ buildLogPageUrl }}
View build log
Hosted changelog page
A public "What's new" page for this project β nothing to host yourself.
{{ changelogPageUrl }}
Open
Embed on your own site
WhitelabelOne line. A neutral "What's new" bell that opens this project's updates. Your brand only.
{{ changelogEmbedSnippet }}
Add a container on your page where it should render, e.g. <div id="whats-new"></div>, and the widget mounts into it.
Where to paste it
RSS feed
For readers who follow you via RSS.
{{ changelogRssUrl }}
Open
Walkthroughs
No installA one-time setup: add the Walkthroughs button to your browser's bookmark bar. Later, open your product and click it whenever you want to record a clickable walkthrough β nothing to download.
One-time: drag it to your bookmark bar. Then open your product in a tab β click the bookmark β choose βThis tabβ β click through your flow β Finish. The session token refreshes about hourly; re-drag if it ever stops working.
{{ w.title || 'Untitled walkthrough' }}
{{ w.status }} Β· /w/{{ w.share_token }}
No walkthroughs yet. Record your first with the button above.
Walkthrough CTA end screen
Per projectThe closing call-to-action shown at the end of your shared walkthroughs. New walkthroughs start from these defaults.
The accent colour for the end-screen button and highlights. Tap a swatch from your brand kit, or type any hex.
A full-bleed image behind the end screen. Capture your landing page, paste a URL, or upload one.
{{ endcardBgMsg }}
{{ (endcardForm.headline || '').trim() || 'Your product β see it in action' }}
{{ endcardForm.subhead }}
Updates live as you edit. Save to make it the default for new walkthroughs.
Your logo, colours, fonts and voice for {{ (activeProject && activeProject.name) || 'this domain' }} β each domain keeps its own.
{{ brandKit && (brandKit.logo_light_url || brandKit.logo_dark_url) ? 'Brand kit set up' : 'Not set up yet' }}
Logo, palette, fonts, voice and language β used across every video for this domain.
Which connected repo, deploys, and store activity become this domain's updates.
{{ f.provider }}
{{ f.label || 'β' }} Β· {{ f.status }}
Multiple products in one repo? Set per-codebase names in .
Turn your funding moments into posts β the way your commits, deploys and customers already do. Read-only: we never post to your funding accounts.
GitHub Sponsors
Every new sponsor and your monthly sponsor income, in on their own. Read-only.
One-click GitHub connect is being switched on β please check back soon.
{{ githubConnectMsg }}
Monthly income
{{ fundingIncomeLabel }}
Total sponsors
{{ (funding.snapshot && funding.snapshot.total_sponsors != null) ? funding.snapshot.total_sponsors : (funding.loaded ? 'β' : 'β¦') }}
Last read {{ fmt(funding.snapshot.created_at) }}.
No reading yet.
{{ funding.msg }}
Patreon
Your patrons, in on their own β a new patron becomes a post. Read-only; Patreon has no post API.
One-click Patreon connect is being switched on β please check back soon.
{{ patreonConnectMsg }}
Creator
{{ patreonAccountLabel || 'Connected' }}
Patrons
{{ (funding.patreonSnapshot && funding.patreonSnapshot.total_sponsors != null) ? funding.patreonSnapshot.total_sponsors : (funding.loaded ? 'β' : 'β¦') }}
Last read {{ fmt(funding.patreonSnapshot.created_at) }}.
Patron count is read when you connect β reconnect to refresh it.
Open Collective
Backers and budget from your collective. The connector isn't built yet.
Fund somewhere else?
Tell us where β Buy Me a Coffee, Ko-fi, Liberapay, anywhere. We build the most-asked-for one next.
{{ platformRequest.msg }}
Recent sponsors
New sponsors we've picked up β each is a moment worth sharing.
{{ e.sponsor_entity }}
{{ e.tier_name }} Β· ${{ (e.tier_monthly_cents/100).toFixed(0) }}/mo Β· since {{ fmt(e.sponsor_created_at) }}
{{ funding.loaded ? 'No sponsors yet. When someone sponsors you on GitHub, theyβll show up here.' : 'Loadingβ¦' }}
Live data from your account. FoxPlug checks for new updates every 15 minutes.
{{ admin.error }}
{{ s.label }}
{{ s.count }}
{{ s.pctOfPrev }}% {{ s.note }}
{{ s.count }} {{ s.note }}
| Gift | Posted | Viewed | Played | Claim | Signup | Pro |
|---|---|---|---|---|---|---|
| {{ g.product_name || g.gift_token }} | {{ fmtDate(g.posted_at) }} | {{ g.viewed }} | {{ g.played }} | {{ g.claim_visits }} | {{ g.signups }} | {{ g.pros }} |
{{ adminStats.total }}
Total users
{{ adminStats.free }}
Free
{{ adminStats.pro }}
Pro
{{ adminStats.serial }}
Broadcast
{{ adminStats.trials }}
Trials active
{{ adminStats.new7 }} / {{ adminStats.new30 }}
New 7d / 30d
No users yet
No users match β{{ admin.userSearch }}β.
| Plan | Subscription | Projects | +sites | Trial ends | Created | Last seen | Controls | |
|---|---|---|---|---|---|---|---|---|
| {{ row.email }}admin | {{ adminPlanShown(row) }} | {{ (row.ent_plan || 'β') + (row.ent_status ? (' Β· ' + row.ent_status) : '') }} subscribed | {{ row.projects_count }} | {{ row.extra_projects || 0 }} | {{ fmtDate(row.trial_ends_at) }} | {{ fmtDate(row.created_at) }} | {{ fmtDate(row.last_sign_in_at) }} |
|
No responses yet
{{ grp.label }}
β
| Database | Repo | No-code | IDE | Other |
|---|---|---|---|---|
| {{ r.db || 'β' }} | {{ r.repo || 'β' }} | {{ r.nocode_builder || 'β' }} | {{ r.ide || 'β' }} | {{ r.other_text || 'β' }} |
New {{ phGrpUnseenReplies.length === 1 ? 'reply' : 'replies' }} ({{ phGrpUnseenReplies.length }})
{{ replyClean(r.reply_text) }}
{{ d }}
Generating ({{ phGrpGenerating.length }})
{{ r.status==='building' ? 'Rendering your launch videoβ¦' : 'Queued β a video will auto-render soon' }}
Ready to post ({{ phGrpReady.length }})
{{ r.comment_text }}
2 Β· Paste your comment link β track replies
{{ phpost.error }}
Posted ({{ phGrpPosted.length }})
{{ r.reply_author || 'The maker' }} replied:
{{ replyClean(r.reply_text) }}
{{ d }}
No launches loaded yet β hit βRefresh candidatesβ. New launches auto-render into videos on their own from here.
{{ phpromo.error }}
{{ phpromo.note }}
Loadingβ¦
No fresh candidates. Hit βRefresh candidatesβ to scan for new launches.
Nothing ready to post yet (needs a rendered video, a comment, and a YouTube URL). Switch to to see candidates in progress.
{{ r.gift_reason }}
{{ r.product_site_url }} β{{ (r.genState==='processing' || r.status==='building') ? 'Generating (queued by you)β¦' : 'Queued by youβ¦' }}
Failed: {{ r.genError || 'render error' }} β try again.
{{ r.tagline || '' }}
{{ phWhyNot(r) }}
{{ (r.genState==='processing' || r.status==='building') ? 'Generating (queued by you)β¦' : 'Queued by youβ¦' }}
Failed: {{ r.genError || 'render error' }} β try again.
{{ (r.genState==='processing' || r.status==='building') ? 'Regenerating (queued by you)β¦' : 'Queued by youβ¦' }}
β New version ready β click βΆ to watch it, then copy.
Regenerate failed: {{ r.genError || 'render error' }}
{{ phpromo.error }}
{{ phpromo.note }}
No replies detected yet. The poller checks posted launches automatically.
{{ replyClean(r.reply_text) }}
Clean, watermark-free launch videos from the EXACT page(s) you give β interior, feature and pricing pages welcome (the best material is often inside). You also get a GIF, sticker and poster.
{{ launchvid.result.product_name || 'Your launch video' }} β ready
Suggested interior pages β click to include:
We couldn't build a strong video from those URL(s).
{{ launchvid.rejectMsg || 'Upload one or more screenshots (and optional instructions) and we will build the video from those. Your URLs and options above are kept.' }}
Screenshots {{ launchvid.showFallback ? '(needed)' : '(optional)' }}
{{ launchvid.error }}
{{ launchvid.statusMsg || 'Rendering your launch video β this takes a couple of minutes. The video appears only when it is fully ready.' }}
Switch to the tab you're demoingβ¦
Recording starts in {{ rec.countdown }}s
{{ rec.callouts.length }} callout{{ rec.callouts.length===1?'':'s' }} added