Domains
{{ projects.length }}/{{ projectCap }} used on your {{ planLabel }} plan
{{ p.url || 'No URL set' }}
Preparing brand kit…
Your plan includes {{ projectCap }} domain{{ projectCap === 1 ? '' : 's' }} — upgrade for more.
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 watched you ship and wrote your first post. Review and approve 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 goes out without your approval.
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.
We turned your work into posts. Nothing publishes until you approve.
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.
Unshared wins about to age out — share before they're old news.
One update → a post or thread. Pick a format, generate, edit & post.
Review & publish your posts across every channel.
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.
Long-form write-ups & docs — coming soon.
{{ 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
…or pick one you own
{{ gifStudio.caption.length >= 24 ? 'Max length reached — 24 characters.' : ((24 - gifStudio.caption.length) + ' characters left (max 24).') }}
Tags appear here automatically once you render the GIF — then add more.
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.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).') }}
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).') }}
Preview
Log a win
Something you shipped or achieved — it lands in your Milestones right away.
{{ winForm.title.length >= 200 ? 'Max length reached — 200 characters.' : ((200 - winForm.title.length) + ' characters left (max 200).') }}
{{ winForm.detail.length >= 4000 ? 'Max length reached — 4000 characters.' : ((4000 - winForm.detail.length) + ' characters left (max 4000).') }}
Short-form posts
Turn one update into a short post or thread — then edit, approve & post it in Drafts.
No updates in this project yet — log a win first.
Format
{{ f.label }}
{{ f.tip }}
Generated posts land in — edit, approve and post them there. Nothing is ever sent for you.
Share this win
{{ milestoneHeadline(shareSheet) }}
{{ 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, approve & post the text in . Nothing is ever posted for you.
{{ 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' }}.
{{ (progress.verdict || progressTodayEntry).summary || 'Logged.' }}
✓ Counts toward your streak — nice move 🎉
Logged. Small day — that's fine.
{{ (progress.verdict || progressTodayEntry).coach_note }}
Start your streak — what did you move forward today?
{{ progress.input.length }} / 280 — max reached
{{ progress.error }}
{{ coach.insight }}
Your GIFs and stickers are out in the world. Views land here as people pick them up.
{{ 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.
Your reach numbers will appear here.
🔥 {{ progressStreak }}-day building streak · {{ progressDaysThisMonth }} {{ progressDaysThisMonth === 1 ? 'day' : 'days' }} you moved something real forward this month
Your build log starts with today
What did you move forward?
{{ g.label }}
You're caught up 🎉
Ship something and it'll show up here, ready to share.
Review new ships {{ todayReview.length }}
We turned your work into posts — give them a quick look and approve.
Ready to post {{ todayReady.length }}
Approved and waiting — open the Post Kit and send each in one tap.
Make a visual {{ todayMakeVisual.length }}
Big ships that deserve an image or GIF.
Share to your channels
Push a recent ship into your connected chat.
Finish setting up distribution {{ distributionRemaining }} left
More doors = more reach: {{ i ? ', ' : '' }}{{ d.label }}.
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 approving.
4. Apply for a Brand Channel: https://support.giphy.com/hc/en-us/articles/360019977992-Apply-For-A-Brand-Channel ↗
5. Approval takes a few days (sometimes up to two weeks). Until approved, 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.)
{{ 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 2 of your sources (GitHub, Stripe, Vercel…) and we'll make a video about what you've already shipped — {{ 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 approve it here and publish.
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 is posted until you click a destination — 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.
Paste these into a new post, set the canonical URL to your original so it keeps the SEO credit, then publish.
{{ 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.
Post automatically — {{ broadcastSummary(d) }}
Approve it in Drafts first, then it can post on its own hereYour 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.
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.
Style
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 approved 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
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.
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.
No ships in {{ (activeProject && activeProject.name) || 'this project' }} yet — the launch builds from your site.
{{ videoStudio.launchIds.length }} selected
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) }}
Watch it, then approve 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.
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.
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
Open Startup Score
{{ ossScore }}/100
{{ ossBand.label }}
vs other build-in-public teams
Today
{{ shareBuckets.today.small + shareBuckets.today.big }}
{{ shareBuckets.today.small }} small · {{ shareBuckets.today.big }} big
This week
{{ shareBuckets.week.small + shareBuckets.week.big }}
{{ shareBuckets.week.small }} small · {{ shareBuckets.week.big }} big
This month
{{ shareBuckets.month.small + shareBuckets.month.big }}
{{ shareBuckets.month.small }} small · {{ shareBuckets.month.big }} big
Avg / day · small
{{ shareAverages.small }}
Avg / day · big
{{ shareAverages.big }}
Trend · last 30 days
Daily share average, rising or falling.
Analytics is a Pro feature
See impressions, views, clicks, and reactions per entry. Upgrade to Pro.
See ProNo analytics yet
Approve a post and publish a changelog entry, then embed the widget on your site — views, clicks and reactions 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.
Connecting dev.to, Hashnode, Discord and Slack now lives in the tab.
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' }}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 approved posts go out on their own. 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.
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.
Approval mode
Choose whether drafts wait for you, or go out automatically.
Approval required is the safe default. Turn on autopilot only when you trust the drafts.
In autopilot, approved drafts auto-post to Telegram only. X, LinkedIn and the rest are auto-approved and queued as copy-ready — you still post those yourself in one click.
Connect Telegram
Telegram is the only channel with a real auto-poster. 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 approved drafts go. Only Telegram auto-posts; everything else is one-click copy-to-post.
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 .
Live data from your account. FoxPlug checks for new updates every 15 minutes.
{{ admin.error }}
{{ 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 || '—' }} |
{{ phpromo.error }}
{{ phpromo.note }}
Loading…
| Product | Makers | Signal | |||
|---|---|---|---|---|---|
{{ r.product_name }} {{ r.tagline }} |
{{ (r.makers||[]).join(', ') }} | {{ r.source }}{{ phMeta(r) }} | Open ↗ |
{{ r.reply_author || 'Maker' }} replied{{ r.reply_at ? ' · ' + fmtDate(r.reply_at) : '' }}
{{ r.reply_text }}
{{ phpost.error }}
{{ phpost.note }}
Loading…
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.' }}
Drop a warm, specific launch-day comment on today's indie launches — with a FoxPlug showcase video attached when it finishes rendering.
{{ promo.error }}
{{ promo.note }}
{{ l.tagline }}
first comment by @{{ l.first_comment_by }} · site ↗
No qualifying launches for {{ promo.date }}.