Don't let your deploys go unnoticed.

Every deployment is a win. Dplyd gives developers a simple public log of what shipped, when it shipped, and why it mattered. Share your wins, build a streak, and celebrate with the community.

Free forever No credit card API access included
Team of developers celebrating a successful deployment

Here's how it works.

Step 1

Deploy your code

Push to production using your favorite tools. Add one curl to your CI/CD — that's it.

Step 2

Share the moment

Your deployment appears in the live feed for the world to see. Add context about what you shipped.

Step 3

Celebrate together

Get reactions from fellow developers. Build your streak and show off with embeddable badges.

Polaroid photos of deployment moments scattered on a desk

Every deployment tells a story.

A midnight bug fix. A major feature launch. A complete rewrite that was totally worth it. Your deployments are more than git commits — they're milestones worth remembering.

Public deploy log

A permanent record of everything you've shipped, visible on your profile.

Embeddable badges

Add a live deploy badge to your GitHub README or portfolio. Updates automatically.

Shipping streaks

Track your consistency. How many days in a row can you ship?

deploy.sh
# After your deploy succeeds...
curl -X POST https://dplyd.com/api \
  -H "Authorization: Bearer $DPLYD_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message": "Shipped v2.0!"}'

View full API docs →

One line in your CI/CD.

Add a single curl command to your deployment script. That's it. Works with GitHub Actions, GitLab CI, Vercel, Netlify, or any pipeline.

  • No SDK required — just HTTP
  • Supports any language or platform
  • Real-time broadcast to followers

Your deploys deserve an audience.

Join developers who celebrate their deployments and build in public. Free forever. No credit card required.

Create your free account

Live Feed

Real-time deployments from the community

Live
Peter Theill
Peter Theill 
deployed a styling change about 8 hours ago
about 8 hours ago
✨ Enrich the pricing page with a comparison matrix, facts and FAQ
Move price and button into a tinted footer band on each card, with the
cards as a subgrid so footers align however the taglines wrap. Below
the cards: an included-on-every-plan grid, a feature matrix driven by
Plan entitlements, three billing facts, a pricing FAQ with JSON-LD and
the shared call to action. State that prices exclude VAT on the pricing
and billing pages, and mirror the matrix and FAQ in llms-full.txt.
💄 Replace pricing avatars with Notion-style ink illustrations
Three hand-drawn characters (one bulb, juggling bulbs, mad scientist)
as transparent PNGs with a baked-in white halo, sitting astride each
card's top edge. Move the Most popular badge to the top-left so it
clears the figure, and send guests on the free tier to the waitlist
while registration is closed.
Peter Theill
Peter Theill 
deployed a styling change about 8 hours ago
about 8 hours ago
✨ Redesign transactional mail and cover every account event
All mail now shares one monochrome layout (gray ground, hairline card,
wordmark with the single emerald dot) built from inline-styled helpers in
MailerHelper: eyebrow, heading, black or hairline button, one gray panel,
mono block, status rows. Warnings are plain text with a bold lead-in, never
a coloured box. Subjects drop their emoji.
New mails, each hooked at the model or service so every entry point fires:

  • UserMailer#welcome on account creation, listing owned packages and the


developer-mode extension install steps

  • ProjectMailer#created when an owned package is added (waitlist drafts skip)

  • DirectorySubmissionMailer#submissions_created when a maker queues


directories, one row per directory with submit link and mode

  • WaitlistMailer#confirmation on a new waitlist signup

  • BillingMailer plan_activated / payment_failed / plan_cancelled from


activate_plan!, grant_plan!, cancel_plan! and the Stripe webhook
The unused batch_complete mail is removed. Previews for every variant live
under test/mailers/previews with in-memory sample records, so /rails/mailers
renders on an empty database. Adds mailer and hook tests, and a launch.json
attach config for the dev server on :3109.
💄 Share one page header across public pages, replacing breadcrumbs
Every public page (directories, guides, use cases, pricing, about, help,
legal, extension, WebMCP) now opens with the same `shared/page_header`
partial inside a `.page` frame, so the content edge and heading rhythm
stop jumping between sections. The eyebrow links back to the section
index with a dotted underline instead of a breadcrumb trail.
Also: hand-drawn plan avatars on the pricing tiers, a grayscale footer
logo that colours on hover, a base rule so every enabled button shows a
pointer cursor, and the seed admin address moved to support@launchto.win.
Peter Theill
Peter Theill 
deployed a feature about 13 hours ago
about 13 hours ago
Merge branch 'launch-page-product-insights'
:whale: Ship headless Chromium in the production image for JavaScript-rendered landing pages
PageRendererService (and the Playwright directory automation) need a
Playwright CLI and Chromium at runtime. The final stage now copies Node from
node:22-trixie-slim (same Debian release as the Ruby base), installs the
playwright package pinned to the version the playwright-ruby-client gem
speaks, runs playwright install --with-deps chromium into /ms-playwright,
and sets PLAYWRIGHT_CLI so the app uses the global CLI instead of npx.
Browsers are world-readable so the non-root rails user can launch them.
Verified by building the image locally and rendering a JavaScript page in
it as the rails user.
✨ Give the product analysis real material: render JS shells, read linked pages, search the web
Single-page apps such as q.cv ship an empty <div id="root"> so the scrape
had nothing to give the model. Three changes:

  • PageRendererService renders the page in headless Chromium (Playwright,


optional and self-disabling when the CLI is missing) whenever the static
HTML has fewer than 40 readable words; the scraper re-extracts insights,
description and social image from the rendered DOM. Page requests to
private networks are blocked at the route level.

  • ProductAnalysisService fetches up to two linked pricing/about/docs pages


(static, trimmed) and passes them alongside the landing page, and turns on
OpenRouter's web-search plugin so the model can learn how the product is
used, compared and received. Toggle with credentials openrouter.web_search
or OPENROUTER_WEB_SEARCH. The model is now asked even when the landing page
had no text, told explicitly that it is a JavaScript app.

  • Output budget raised to 8000 tokens because reasoning models count their


thinking against it and returned empty content; empty replies now log the
finish reason and usage. The result carries a sources block, shown as the
panel subtitle.
Tests stub the credential lookups so they no longer depend on whether the
master key is present.
🔐 Add OpenRouter api_key and model to credentials
♻️ Route the product analysis through OpenRouter so the model is a config choice
ProductAnalysisService now talks to OpenRouter's OpenAI-compatible chat
endpoint via the ruby-openai gem already in the bundle. The model comes from
OPENROUTER_MODEL / credentials openrouter.model (default
anthropic/claude-sonnet-5), the key from OPENROUTER_API_KEY /
credentials openrouter.api_key. Strict json_schema output is requested first
and the call is retried on a plain JSON-only prompt when a model rejects it;
fenced or prefixed JSON is tolerated. Result cache is keyed by model + URL.
✨ Show what we learned about the product on /launch, with an AI read of the landing page
The preview step now aims for "they really understood my product":

  • ProductInsightsService extracts deterministic facts from the page the


scraper already fetched: detected stack (Next.js, Stripe, Plausible…),
linked pages (pricing, docs, changelog…), platform and business signals
(iOS app, free trial, SOC 2…), headings, calls to action, contact emails,
structured data and word count. Rendered in a new "At a glance" card.

  • ProductAnalysisService asks Claude (claude-opus-5, structured JSON output,


low effort) to explain the product back: summary, audience, key features,
differentiators, comparable products, pricing model, a directory-ready
pitch, launch angles and suggested tags. Served by GET /projects/analysis
as a second step after /metadata, reusing the cached page text; results
cached per URL for a day; rate limited; hidden entirely when no Anthropic
key is configured.

  • /launch rearranged at package-page width: product card + glance card side


by side, the AI panel below with a loading skeleton, then the CTA. Signed-in
makers get the same panels next to the editor, and suggested tags,
comparable products and the pitch flow into the package fields.

  • All scraped/AI text is rendered with DOM APIs instead of innerHTML.

💄 Widen /launch to match the package pages and skip the URL input flash on prefilled URLs

  • Wrap the page in max-w-6xl (same as packages index/show/edit) so the


editor's three-column grid has room; keep the hero, URL step and guest
preview card centred at max-w-3xl.

  • When arriving with ?url= the URL card is rendered hidden and the


"Fetching project details" status is rendered server-side, and the
controller autofills on connect without the 500ms delay, so the input
no longer flashes before the details replace it.
Peter Theill
Peter Theill 
deployed a feature about 13 hours ago
Peter Theill
Peter Theill 
deployed a feature about 14 hours ago
about 14 hours ago
🚨 Ignore two Brakeman SQL-injection false positives from the admin sort and submission work order
Peter Theill
Peter Theill 
deployed a performance improvement 1 day ago
1 day ago
⚡️ Defer the Font Awesome kit, drop unused PhotoSwipe, lazy-load controllers, and fix landing page a11y
Perf: the kit script was parser-blocking in <head> and held first paint for
150-350ms while the main thread sat idle; it is now deferred and icons reserve
a 1em box so the late CSS causes no layout shift. PhotoSwipe (CSS from jsDelivr
plus two importmap pins) and the lightbox/hello controllers had no callers and
are removed. Stimulus controllers load on demand instead of eagerly preloading
all 24, and the nav/footer logo is a 96px PNG instead of the 1024px icon.
A11y (Lighthouse 84): html lang, empty alt on the decorative logo, aria-label
on the hero URL input, gray-500 for the eyebrow/footer labels that failed AA
contrast, and aria-hidden on every icon glyph.
Peter Theill
Peter Theill 
deployed a styling change 1 day ago
1 day ago
Merge branch 'worktree-remove-header-confetti'
💄 Remove the confetti effect from the header wordmark
Peter Theill
Peter Theill 
deployed a performance improvement 1 day ago
Peter Theill
Peter Theill 
deployed a feature 1 day ago
1 day ago
✨ Add the SEO surface and refresh the landing page
Guides, directory collections, per-audience use-case pages, llms.txt and
a pages sitemap, with breadcrumbs, FAQ schema and shared CTA partials.
Landing page: the directory count is read from the database everywhere
instead of a hardcoded 46 (new directory_count helper, %{directory_count}
placeholders in use-case copy), the hero URL field gets a visible icon
and a gradient focus ring, and the resources section is redesigned as a
content section with a heading, blurbs and arrowed links instead of
footer-style link columns.
Support
Support 
deployed a bug fix 1 day ago
1 day ago
🐛 Add grouping by source agent ID in events table ✨ Add source agent details to event queries