Peter Theill

Peter Theill

Commanigy

My name is Peter Theill, a Copenhagen-based software engineer and entrepreneur. I’m a co-founder of Zublime, Outbound & Familio but also do indie-hacking at Commanigy. I started playing around with programming back in 1987 on a good old Commodore 64 and released my first couple of shareware products on Windows around 1994.

Deployment Stats

Total deployments
1027

over 539 days

This week
1

47 this month

Most active day
27

on Nov 15, 2025

Running year activity
ā–„
64 deployments in Oct
Oct
ā–‡
111 deployments in Nov
Nov
ā–‡
123 deployments in Dec
Dec
ā–ˆ
127 deployments in Jan
Jan
ā–…
81 deployments in Feb
Feb
ā–†
96 deployments in Mar
Mar
ā–ƒ
42 deployments in Apr
Apr
▁
6 deployments in May
May
▁
3 deployments in Jun
Jun
▁
4 deployments in Jul
Jul
ā–ƒ
39 deployments in Aug
Aug
ā–‚
28 deployments in Sep
Sep
Daily activity
Oct
Nov
Dec
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Mon Wed Fri
0 deployments on Sun, Sep 28, 2025
0 deployments on Mon, Sep 29, 2025
0 deployments on Tue, Sep 30, 2025
0 deployments on Wed, Oct 01, 2025
0 deployments on Thu, Oct 02, 2025
0 deployments on Fri, Oct 03, 2025
0 deployments on Sat, Oct 04, 2025
0 deployments on Sun, Oct 05, 2025
1 deployment on Mon, Oct 06, 2025
0 deployments on Tue, Oct 07, 2025
0 deployments on Wed, Oct 08, 2025
7 deployments on Thu, Oct 09, 2025
4 deployments on Fri, Oct 10, 2025
1 deployment on Sat, Oct 11, 2025
5 deployments on Sun, Oct 12, 2025
2 deployments on Mon, Oct 13, 2025
1 deployment on Tue, Oct 14, 2025
1 deployment on Wed, Oct 15, 2025
1 deployment on Thu, Oct 16, 2025
7 deployments on Fri, Oct 17, 2025
9 deployments on Sat, Oct 18, 2025
5 deployments on Sun, Oct 19, 2025
5 deployments on Mon, Oct 20, 2025
10 deployments on Tue, Oct 21, 2025
3 deployments on Wed, Oct 22, 2025
1 deployment on Thu, Oct 23, 2025
1 deployment on Fri, Oct 24, 2025
0 deployments on Sat, Oct 25, 2025
0 deployments on Sun, Oct 26, 2025
0 deployments on Mon, Oct 27, 2025
0 deployments on Tue, Oct 28, 2025
0 deployments on Wed, Oct 29, 2025
0 deployments on Thu, Oct 30, 2025
0 deployments on Fri, Oct 31, 2025
0 deployments on Sat, Nov 01, 2025
0 deployments on Sun, Nov 02, 2025
0 deployments on Mon, Nov 03, 2025
0 deployments on Tue, Nov 04, 2025
0 deployments on Wed, Nov 05, 2025
2 deployments on Thu, Nov 06, 2025
0 deployments on Fri, Nov 07, 2025
0 deployments on Sat, Nov 08, 2025
2 deployments on Sun, Nov 09, 2025
5 deployments on Mon, Nov 10, 2025
2 deployments on Tue, Nov 11, 2025
2 deployments on Wed, Nov 12, 2025
0 deployments on Thu, Nov 13, 2025
3 deployments on Fri, Nov 14, 2025
27 deployments on Sat, Nov 15, 2025
1 deployment on Sun, Nov 16, 2025
0 deployments on Mon, Nov 17, 2025
1 deployment on Tue, Nov 18, 2025
2 deployments on Wed, Nov 19, 2025
4 deployments on Thu, Nov 20, 2025
5 deployments on Fri, Nov 21, 2025
2 deployments on Sat, Nov 22, 2025
6 deployments on Sun, Nov 23, 2025
9 deployments on Mon, Nov 24, 2025
4 deployments on Tue, Nov 25, 2025
2 deployments on Wed, Nov 26, 2025
7 deployments on Thu, Nov 27, 2025
5 deployments on Fri, Nov 28, 2025
12 deployments on Sat, Nov 29, 2025
8 deployments on Sun, Nov 30, 2025
7 deployments on Mon, Dec 01, 2025
0 deployments on Tue, Dec 02, 2025
0 deployments on Wed, Dec 03, 2025
0 deployments on Thu, Dec 04, 2025
7 deployments on Fri, Dec 05, 2025
3 deployments on Sat, Dec 06, 2025
5 deployments on Sun, Dec 07, 2025
0 deployments on Mon, Dec 08, 2025
3 deployments on Tue, Dec 09, 2025
4 deployments on Wed, Dec 10, 2025
1 deployment on Thu, Dec 11, 2025
10 deployments on Fri, Dec 12, 2025
6 deployments on Sat, Dec 13, 2025
2 deployments on Sun, Dec 14, 2025
6 deployments on Mon, Dec 15, 2025
1 deployment on Tue, Dec 16, 2025
2 deployments on Wed, Dec 17, 2025
5 deployments on Thu, Dec 18, 2025
1 deployment on Fri, Dec 19, 2025
10 deployments on Sat, Dec 20, 2025
4 deployments on Sun, Dec 21, 2025
6 deployments on Mon, Dec 22, 2025
2 deployments on Tue, Dec 23, 2025
0 deployments on Wed, Dec 24, 2025
0 deployments on Thu, Dec 25, 2025
3 deployments on Fri, Dec 26, 2025
7 deployments on Sat, Dec 27, 2025
3 deployments on Sun, Dec 28, 2025
6 deployments on Mon, Dec 29, 2025
11 deployments on Tue, Dec 30, 2025
8 deployments on Wed, Dec 31, 2025
11 deployments on Thu, Jan 01, 2026
13 deployments on Fri, Jan 02, 2026
8 deployments on Sat, Jan 03, 2026
13 deployments on Sun, Jan 04, 2026
4 deployments on Mon, Jan 05, 2026
3 deployments on Tue, Jan 06, 2026
5 deployments on Wed, Jan 07, 2026
8 deployments on Thu, Jan 08, 2026
1 deployment on Fri, Jan 09, 2026
0 deployments on Sat, Jan 10, 2026
1 deployment on Sun, Jan 11, 2026
6 deployments on Mon, Jan 12, 2026
0 deployments on Tue, Jan 13, 2026
3 deployments on Wed, Jan 14, 2026
4 deployments on Thu, Jan 15, 2026
3 deployments on Fri, Jan 16, 2026
1 deployment on Sat, Jan 17, 2026
5 deployments on Sun, Jan 18, 2026
4 deployments on Mon, Jan 19, 2026
2 deployments on Tue, Jan 20, 2026
8 deployments on Wed, Jan 21, 2026
4 deployments on Thu, Jan 22, 2026
2 deployments on Fri, Jan 23, 2026
5 deployments on Sat, Jan 24, 2026
3 deployments on Sun, Jan 25, 2026
1 deployment on Mon, Jan 26, 2026
1 deployment on Tue, Jan 27, 2026
0 deployments on Wed, Jan 28, 2026
0 deployments on Thu, Jan 29, 2026
6 deployments on Fri, Jan 30, 2026
2 deployments on Sat, Jan 31, 2026
1 deployment on Sun, Feb 01, 2026
2 deployments on Mon, Feb 02, 2026
6 deployments on Tue, Feb 03, 2026
2 deployments on Wed, Feb 04, 2026
0 deployments on Thu, Feb 05, 2026
2 deployments on Fri, Feb 06, 2026
0 deployments on Sat, Feb 07, 2026
1 deployment on Sun, Feb 08, 2026
1 deployment on Mon, Feb 09, 2026
2 deployments on Tue, Feb 10, 2026
0 deployments on Wed, Feb 11, 2026
5 deployments on Thu, Feb 12, 2026
7 deployments on Fri, Feb 13, 2026
6 deployments on Sat, Feb 14, 2026
1 deployment on Sun, Feb 15, 2026
5 deployments on Mon, Feb 16, 2026
1 deployment on Tue, Feb 17, 2026
4 deployments on Wed, Feb 18, 2026
4 deployments on Thu, Feb 19, 2026
1 deployment on Fri, Feb 20, 2026
0 deployments on Sat, Feb 21, 2026
3 deployments on Sun, Feb 22, 2026
3 deployments on Mon, Feb 23, 2026
0 deployments on Tue, Feb 24, 2026
2 deployments on Wed, Feb 25, 2026
2 deployments on Thu, Feb 26, 2026
6 deployments on Fri, Feb 27, 2026
14 deployments on Sat, Feb 28, 2026
1 deployment on Sun, Mar 01, 2026
1 deployment on Mon, Mar 02, 2026
3 deployments on Tue, Mar 03, 2026
0 deployments on Wed, Mar 04, 2026
4 deployments on Thu, Mar 05, 2026
3 deployments on Fri, Mar 06, 2026
0 deployments on Sat, Mar 07, 2026
2 deployments on Sun, Mar 08, 2026
8 deployments on Mon, Mar 09, 2026
0 deployments on Tue, Mar 10, 2026
5 deployments on Wed, Mar 11, 2026
3 deployments on Thu, Mar 12, 2026
2 deployments on Fri, Mar 13, 2026
4 deployments on Sat, Mar 14, 2026
9 deployments on Sun, Mar 15, 2026
1 deployment on Mon, Mar 16, 2026
2 deployments on Tue, Mar 17, 2026
0 deployments on Wed, Mar 18, 2026
1 deployment on Thu, Mar 19, 2026
6 deployments on Fri, Mar 20, 2026
8 deployments on Sat, Mar 21, 2026
13 deployments on Sun, Mar 22, 2026
2 deployments on Mon, Mar 23, 2026
3 deployments on Tue, Mar 24, 2026
2 deployments on Wed, Mar 25, 2026
5 deployments on Thu, Mar 26, 2026
2 deployments on Fri, Mar 27, 2026
2 deployments on Sat, Mar 28, 2026
0 deployments on Sun, Mar 29, 2026
1 deployment on Mon, Mar 30, 2026
3 deployments on Tue, Mar 31, 2026
0 deployments on Wed, Apr 01, 2026
1 deployment on Thu, Apr 02, 2026
3 deployments on Fri, Apr 03, 2026
1 deployment on Sat, Apr 04, 2026
6 deployments on Sun, Apr 05, 2026
1 deployment on Mon, Apr 06, 2026
2 deployments on Tue, Apr 07, 2026
1 deployment on Wed, Apr 08, 2026
0 deployments on Thu, Apr 09, 2026
0 deployments on Fri, Apr 10, 2026
7 deployments on Sat, Apr 11, 2026
3 deployments on Sun, Apr 12, 2026
1 deployment on Mon, Apr 13, 2026
2 deployments on Tue, Apr 14, 2026
0 deployments on Wed, Apr 15, 2026
2 deployments on Thu, Apr 16, 2026
0 deployments on Fri, Apr 17, 2026
1 deployment on Sat, Apr 18, 2026
6 deployments on Sun, Apr 19, 2026
2 deployments on Mon, Apr 20, 2026
1 deployment on Tue, Apr 21, 2026
1 deployment on Wed, Apr 22, 2026
1 deployment on Thu, Apr 23, 2026
0 deployments on Fri, Apr 24, 2026
0 deployments on Sat, Apr 25, 2026
0 deployments on Sun, Apr 26, 2026
0 deployments on Mon, Apr 27, 2026
0 deployments on Tue, Apr 28, 2026
0 deployments on Wed, Apr 29, 2026
0 deployments on Thu, Apr 30, 2026
0 deployments on Fri, May 01, 2026
1 deployment on Sat, May 02, 2026
0 deployments on Sun, May 03, 2026
0 deployments on Mon, May 04, 2026
0 deployments on Tue, May 05, 2026
0 deployments on Wed, May 06, 2026
0 deployments on Thu, May 07, 2026
0 deployments on Fri, May 08, 2026
0 deployments on Sat, May 09, 2026
0 deployments on Sun, May 10, 2026
0 deployments on Mon, May 11, 2026
0 deployments on Tue, May 12, 2026
0 deployments on Wed, May 13, 2026
0 deployments on Thu, May 14, 2026
0 deployments on Fri, May 15, 2026
0 deployments on Sat, May 16, 2026
0 deployments on Sun, May 17, 2026
0 deployments on Mon, May 18, 2026
0 deployments on Tue, May 19, 2026
0 deployments on Wed, May 20, 2026
0 deployments on Thu, May 21, 2026
1 deployment on Fri, May 22, 2026
0 deployments on Sat, May 23, 2026
0 deployments on Sun, May 24, 2026
0 deployments on Mon, May 25, 2026
1 deployment on Tue, May 26, 2026
0 deployments on Wed, May 27, 2026
0 deployments on Thu, May 28, 2026
1 deployment on Fri, May 29, 2026
0 deployments on Sat, May 30, 2026
2 deployments on Sun, May 31, 2026
0 deployments on Mon, Jun 01, 2026
0 deployments on Tue, Jun 02, 2026
0 deployments on Wed, Jun 03, 2026
0 deployments on Thu, Jun 04, 2026
0 deployments on Fri, Jun 05, 2026
0 deployments on Sat, Jun 06, 2026
0 deployments on Sun, Jun 07, 2026
0 deployments on Mon, Jun 08, 2026
0 deployments on Tue, Jun 09, 2026
0 deployments on Wed, Jun 10, 2026
0 deployments on Thu, Jun 11, 2026
1 deployment on Fri, Jun 12, 2026
0 deployments on Sat, Jun 13, 2026
0 deployments on Sun, Jun 14, 2026
0 deployments on Mon, Jun 15, 2026
0 deployments on Tue, Jun 16, 2026
0 deployments on Wed, Jun 17, 2026
0 deployments on Thu, Jun 18, 2026
0 deployments on Fri, Jun 19, 2026
0 deployments on Sat, Jun 20, 2026
0 deployments on Sun, Jun 21, 2026
0 deployments on Mon, Jun 22, 2026
1 deployment on Tue, Jun 23, 2026
1 deployment on Wed, Jun 24, 2026
0 deployments on Thu, Jun 25, 2026
0 deployments on Fri, Jun 26, 2026
0 deployments on Sat, Jun 27, 2026
0 deployments on Sun, Jun 28, 2026
0 deployments on Mon, Jun 29, 2026
0 deployments on Tue, Jun 30, 2026
0 deployments on Wed, Jul 01, 2026
0 deployments on Thu, Jul 02, 2026
0 deployments on Fri, Jul 03, 2026
0 deployments on Sat, Jul 04, 2026
0 deployments on Sun, Jul 05, 2026
0 deployments on Mon, Jul 06, 2026
0 deployments on Tue, Jul 07, 2026
0 deployments on Wed, Jul 08, 2026
0 deployments on Thu, Jul 09, 2026
0 deployments on Fri, Jul 10, 2026
0 deployments on Sat, Jul 11, 2026
0 deployments on Sun, Jul 12, 2026
0 deployments on Mon, Jul 13, 2026
0 deployments on Tue, Jul 14, 2026
0 deployments on Wed, Jul 15, 2026
0 deployments on Thu, Jul 16, 2026
0 deployments on Fri, Jul 17, 2026
0 deployments on Sat, Jul 18, 2026
0 deployments on Sun, Jul 19, 2026
0 deployments on Mon, Jul 20, 2026
0 deployments on Tue, Jul 21, 2026
0 deployments on Wed, Jul 22, 2026
0 deployments on Thu, Jul 23, 2026
0 deployments on Fri, Jul 24, 2026
0 deployments on Sat, Jul 25, 2026
1 deployment on Sun, Jul 26, 2026
2 deployments on Mon, Jul 27, 2026
0 deployments on Tue, Jul 28, 2026
1 deployment on Wed, Jul 29, 2026
0 deployments on Thu, Jul 30, 2026
0 deployments on Fri, Jul 31, 2026
0 deployments on Sat, Aug 01, 2026
0 deployments on Sun, Aug 02, 2026
0 deployments on Mon, Aug 03, 2026
0 deployments on Tue, Aug 04, 2026
0 deployments on Wed, Aug 05, 2026
0 deployments on Thu, Aug 06, 2026
0 deployments on Fri, Aug 07, 2026
0 deployments on Sat, Aug 08, 2026
0 deployments on Sun, Aug 09, 2026
3 deployments on Mon, Aug 10, 2026
5 deployments on Tue, Aug 11, 2026
0 deployments on Wed, Aug 12, 2026
1 deployment on Thu, Aug 13, 2026
0 deployments on Fri, Aug 14, 2026
0 deployments on Sat, Aug 15, 2026
0 deployments on Sun, Aug 16, 2026
0 deployments on Mon, Aug 17, 2026
0 deployments on Tue, Aug 18, 2026
0 deployments on Wed, Aug 19, 2026
0 deployments on Thu, Aug 20, 2026
3 deployments on Fri, Aug 21, 2026
0 deployments on Sat, Aug 22, 2026
0 deployments on Sun, Aug 23, 2026
5 deployments on Mon, Aug 24, 2026
2 deployments on Tue, Aug 25, 2026
1 deployment on Wed, Aug 26, 2026
0 deployments on Thu, Aug 27, 2026
0 deployments on Fri, Aug 28, 2026
14 deployments on Sat, Aug 29, 2026
5 deployments on Sun, Aug 30, 2026
0 deployments on Mon, Aug 31, 2026
2 deployments on Tue, Sep 01, 2026
2 deployments on Wed, Sep 02, 2026
8 deployments on Thu, Sep 03, 2026
5 deployments on Fri, Sep 04, 2026
0 deployments on Sat, Sep 05, 2026
1 deployment on Sun, Sep 06, 2026
0 deployments on Mon, Sep 07, 2026
0 deployments on Tue, Sep 08, 2026
0 deployments on Wed, Sep 09, 2026
1 deployment on Thu, Sep 10, 2026
0 deployments on Fri, Sep 11, 2026
2 deployments on Sat, Sep 12, 2026
1 deployment on Sun, Sep 13, 2026
0 deployments on Mon, Sep 14, 2026
2 deployments on Tue, Sep 15, 2026
0 deployments on Wed, Sep 16, 2026
0 deployments on Thu, Sep 17, 2026
0 deployments on Fri, Sep 18, 2026
0 deployments on Sat, Sep 19, 2026
3 deployments on Sun, Sep 20, 2026
0 deployments on Mon, Sep 21, 2026
0 deployments on Tue, Sep 22, 2026
1 deployment on Wed, Sep 23, 2026
0 deployments on Thu, Sep 24, 2026
0 deployments on Fri, Sep 25, 2026
0 deployments on Sat, Sep 26, 2026
0 deployments on Sun, Sep 27, 2026
0 deployments on Mon, Sep 28, 2026
Less
More

Recent deployments by Peter Theill

about 1 month ago
šŸ”’ļø Live Stripe only in production
With live keys now in the shared credentials file, configured? became true
in development and test — checkout/cancel/mode gate on live_mode?
(production, or explicit STRIPE_LIVE=1) so local runs and the test suite
always simulate. Caught when a test stubbing production hit live Stripe.
about 1 month ago
šŸ”§ Helper to add Stripe secrets to credentials (price IDs prefilled)
about 1 month ago
✨ Press assets page + rubocop fix
packages#assets now renders a download grid (logo in every directory size,
screenshots) with the JSON manifest still available — the Maker feature is
visible instead of a bare JSON endpoint.
šŸ“ Rewrite the pre-pivot copy — about, help, README; strip public submission feed

  • About and help pages now tell the package-once-launch-everywhere story


(the upvote/bookmark/hot-ranking product they described is gone), styled
to the monochrome direction

  • README rewritten as the launch pitch + accurate dev/production setup;


the four docs it linked no longer existed

  • /directories/:slug no longer lists other users' recent submissions


(name + project + status was public), keeping the page as a sales asset
šŸ”„ Purge the directory-era product-discovery stack

  • Delete the 11 crawlers, orchestrator, ProductSource model, its admin UI,


AutoDiscoveryJob and SourceCrawlJob (WebScrapingJob stays — /launch uses
it for enrichment)

  • Drop the product_sources table

  • Remove empty bookmarks/comments/upvotes helpers and the orphaned


upvote/bookmark helper methods

  • Replace the 241-line demo seeds (sample users with password123 — harmful


in production) with idempotent directory CSV import + launch package
seeds only
šŸ”Š Add Sentry error tracking (inactive until a DSN is configured)
šŸ”§ Align Ruby to 3.4.7 everywhere, fix onboarding landing spots

  • Dockerfile built 3.4.2 and the deploy workflow pinned 3.3.9 while CI


tested on .ruby-version (3.4.7) — all three now agree

  • New signups land on /launch instead of the marketing homepage

  • The unauthenticated /launch fallback stores a return-to so sign-in leads


back to the just-created package
šŸ”’ļø Close the pre-launch security gaps

  • SSRF guard (SafeUrl) on metadata scraping and favicon downloads: http(s)


only, and no hosts resolving to private/loopback/link-local space

  • Rate limits on sign_up, password resets, unauthenticated project


creation, and the metadata endpoint (sessions already had one)

  • Enforced Content-Security-Policy with per-request script nonces, pinned


script hosts, and frame_ancestors none

  • Drop users.hn_username / hn_password_encrypted: no UI ever wrote them,


stored unencrypted, only fed the paused automation tier

  • Untrack data.dump (a production pg_dump!) and ignore *.dump in git and


docker builds — note: it remains in git history
šŸ”’ļø Gate the extension API behind per-user tokens
Implements the recommended call from the launch plan: /api/packages/:slug,
/api/directories/lookup and /api/directories/map now require
Authorization: Bearer <api_token> from a plan with extension access, and
packages/mappings are scoped to the caller's own projects — packages are no
longer publicly enumerable and the Maker tier's headline feature is actually
gated.

  • users.api_token (has_secure_token) + lazy backfill via User#api_token!

  • Token shown on /extension when signed in with extension access

  • Extension v1.7.0: token setting in āš™, Bearer header on API calls, clear


401/403 messages; stale subdomain copy removed

  • rake extension:build regenerates public/launch-to-win-extension.zip from


source (was a stale hand-made 1.6.0); rebuilt at 1.7.0
:email: Wire production SMTP through Resend and fix the from-address

  • production.rb delivers via smtp.resend.com:465 using the smtp.password


credential (a Resend API key); delivery errors now raise so failures
surface instead of silently defaulting to localhost:25

  • From-address is Launch to Win <hello@mail.launchto.win> instead of the


commanigy.com leftover
Remaining manual steps: create the mail.launchto.win sending domain in
Resend, add its DNS records, and put the API key in credentials as
smtp.password.
šŸ”’ļø Make billing production-safe: add stripe gem, refuse simulated checkout in production

  • gem 'stripe' so live mode can actually engage once credentials


(stripe.secret_key, webhook_secret, prices.maker/pro) are added

  • PaymentsService raises NotConfiguredError instead of granting plans for


free when Stripe is unconfigured in production

  • detect_plan re-fetches the checkout session with line_items expanded


(webhook payloads omit them)

  • Webhook lifecycle tests: activation from metadata, price-id fallback,


subscription deleted, payment failed
šŸ”’ļø Enforce plan limits server-side

  • ProjectsController new/create check can_create_package? (the /launch form


was reachable past the hidden dashboard button)

  • Directory submissions: free-tier directory_copy_limit enforced per project;


automation_enabled honored only for plans with auto_submit

  • retry_automation requires can_auto_submit?

  • Automation toggle hidden behind the (off) directory_submissions_enabled


flag + plan check, and no longer defaults to checked

  • DirectorySubmissionJob emails failure once after retries are exhausted,


not on every attempt

  • Fix ensure_owner redirects that pointed at the removed GET project route

  • Tests for the new enforcement paths

šŸš‘ļø Stop hourly AutoDiscoveryJob, fix admin 500 and dead links, add admin:promote task

  • Remove the hourly production AutoDiscoveryJob schedule that was creating


ownerless projects from crawled sources (and exposing them via the API)

  • admin/projects index no longer calls the removed bookmarks_count column;


Stats now shows directory submission count

  • Admin 'view' links point at the package (project_path only routes DELETE)

  • bin/rails admin:promote EMAIL=... mints the first real admin

šŸ’„ Freemium pricing display, pricing-fields UX, form field class normalization
Also save docs/road-to-prime-time.html — the launch-readiness plan.
about 1 month ago
šŸ’„ Bricolage Grotesque display over Inter, Geist Mono accents
about 1 month ago
šŸ”„ Remove brand pages and the wildcard-subdomain requirement
about 1 month ago
ā¬†ļø Upgrade libraries
šŸ”„ Remove domain verification and project claiming
Projects are now owned by their creator from the moment they are made.
The claim/verify flow (meta tag, DNS TXT, file upload, page content),
the ProjectClaim model, the verification columns on projects, and the
verified-owner gate on brand pages are all gone. Existing submitted-but-
unclaimed projects were handed to their submitters in the migration.
about 1 month ago
šŸ’„ Inter typography and a headerless sidebar

  • Bundle Inter (variable, latin woff2 from Google Fonts) and use it


throughout with a larger type scale — body 14px, labels 13px,
hints 12px — replacing the system-font 11-13px mix

  • Drop the topbar (logo + name + subtitle): the sidebar's own Chrome


header already identifies the extension. The āš™ settings toggle
moves into the Package slug section's header row, with the settings
panel opening directly beneath it. Bumps to 1.6.0
about 1 month ago
ā¬†ļø Update brakeman to 8.0.6
bin/brakeman passes --ensure-latest, which exits 5 without scanning
whenever the gem is behind — the actual reason scan_ruby has failed
in CI since March.
about 1 month ago
šŸ› Repair templates broken by the directory teardown
Brakeman's parser caught three views with orphaned markup left by the
block removals — the admin dashboard's reports card, the admin user
page's comments/reports sections (plus a dead @comments query), and
the profile page's bookmarks tail — all of which would 500 when
rendered. Removed the dangling fragments; Brakeman and RuboCop are
both clean.
about 1 month ago
šŸ› Guard screenshot analysis on analyzed?, not width
When no image library is available the analyzer sets no dimensions,
so the width check re-triggered blob.analyze from the after_commit on
every commit until the stack overflowed (SystemStackError in CI).
about 1 month ago
šŸ”„ Remove the public directory — Launch to Win is package-first
The listing/browsing product is gone, no legacy fallbacks kept:

  • Public browsing routes and pages deleted: browse/index, project show,


queued, lifetime deals, free, video reviews, user profiles (public),
my-projects, bookmarks; nav collapses to Directories + Extension and
footers drop the community stats and links

  • Community features deleted outright: upvotes, comments, bookmarks,


reports — models, controllers, views, admin screens, and tables
(DropBrowsingTables migration, irreversible)

  • Legacy deal pricing removed: is_free/is_lifetime_deal/deal_price/


original_price/deal_url columns dropped, pricing_display no longer
falls back, admin + launch forms lose the pricing_type radio,
autofill derives freemium as the default

  • ProjectsController keeps only new/create/destroy/claim/verify/


metadata; claim and verify land on the package hub; project sitemap
and seed-time community data removed
Projects remain solely as the record behind a launch package.
✨ Upload every screenshot, not just five
Drops the per-count cap on screenshot uploads — the only limit left
is a 40MB total payload guard for the injection message (8MB per
file, as before). Bumps to 1.5.2
šŸ”„ Retire the listing editor — the package editor is the editor
Launch to Win pivots from being a directory of projects to packaging
products for launch everywhere, so one editor remains:

  • /projects/:slug/edit and its update redirect to the package editor


(old links and bookmarks keep working); the 454-line tabbed listing
view is deleted

  • Package editor gains contact phone (private, like contact email)


and a danger zone with project deletion; contact_phone is permitted

  • All links and post-create/submission redirects point at the package


editor; deleting redirects to the packages dashboard
šŸ› Click the real option, not its listbox wrapper
fillCombobox matched '[role=option], [role=listbox] li' in document
order, so an inert <li> wrapper with the same text won as the exact
match and its click set nothing. Prefer [role=option] elements, click
the inner button when a wrapper is all we have, and verify the hidden
input's value actually changed — retrying with the widget opened when
the closed-state click doesn't take. Verified live on Huzzler's
category picker. Bumps to 1.5.1
✨ Fill uploads and custom dropdowns from the package

  • logo/screenshots resolve to asset URLs; the panel fetches the bytes


(8MB cap, up to 5 screenshots) and the page fill hands the input
real File objects via DataTransfer, firing input/change

  • Hidden inputs backing custom dropdowns are filled by opening the


widget and clicking the option matching one of the package's
categories (verified against Huzzler's Alpine combobox)

  • Scraper now includes file inputs (even behind styled dropzones) and


named hidden inputs, skipping csrf/honeypot names. Bumps to 1.5.0
✨ Map logo, screenshots and custom category pickers

  • FormFieldMapperService gains logo/screenshots as mappable targets


(file inputs) and allows category on hidden inputs backing custom
dropdowns; accept/multiple pass through to the model

  • PackageSerializer serves assets as storage proxy URLs so the


extension can fetch the bytes from our own host to fill uploads

  • Huzzler curated map now covers category, logo and media uploads

šŸ› Clear error when the API base lacks the map endpoint
A 404 from POST /api/directories/map now says the configured API runs
an older server instead of a bare 'Not Found'. Stored-mapping hits
report source 'cache' so the sidebar can say a mapping was learned
earlier vs mapped just now. Dev hints corrected to port 3109 (bin/dev).
Bumps to 1.4.1
šŸ“ Describe AI form mapping on the site
/extension feature card and the privacy policy now cover on-demand AI
mapping: only form structure is sent, never page values, and learned
mappings are stored and shared.
✨ Autofill any directory via AI mapping

  • Autofill is enabled on every http(s) page once a package is loaded:


curated mappings fill directly, otherwise the sidebar scrapes the
form's field structure (labels, names, attributes — never values),
posts it to /api/directories/map and fills from the answer

  • scrapeFormFields computes verified-unique selectors (#id, [name],


class, nth-of-type path) in the page, so the AI only picks by index

  • Zero fills from a stored mapping trigger one forced AI remap —


self-healing when a site redesigns its form

  • Multi-step forms: each step scrapes differently, so clicking


Autofill per step maps and remembers each step separately

  • Result notes the mapping source. Bumps to 1.4.0

✨ Learn form mappings on demand with AI
POST /api/directories/map answers with a curated Directory mapping,
a stored FormMapping learned earlier, or a fresh AI mapping (Gemini
flash) that is stored and shared by every user and package.

  • FormMapping keys on host + a signature of the form's fields, so a


redesign gets a new mapping and each step of a multi-step form gets
its own row

  • The model only assigns canonical fields to descriptor indexes; the


selectors come verbatim from the page, so it can't hallucinate them

  • force: true skips the stores and remaps (self-healing after a site


redesign); AI calls are throttled per host and per IP and gated on
a valid package slug

  • Verified against Gemini with the real Huzzler form: 4/4 fields,


including the maxlength and the Quill editor, category correctly
skipped
✨ Fill rich-text editors and report unmapped directories honestly

  • fillFormInPage handles contenteditable editors (Quill etc.): builds


paragraphs and fires an input event so the editor syncs

  • A directory that matches but has zero field mappings now reads


'no autofill mapping yet, copy fields below' with autofill disabled
and the copy panel opened, instead of the misleading 'your package
fields for this site are empty'. Bumps to 1.3.0
✨ Add tailored Huzzler field mapping
Selectors verified against huzzler.so/products/create: #name, #url,
#short_description (max 100) and the Quill .ql-editor full description.
Category (custom combobox) and logo/media uploads stay manual.
šŸ“ Update site copy for the sidebar extension
Promo card, /extension page and privacy policy now describe the
sidebar behavior, the per-site access grant, and active-tab hostname
use; ships the 1.2.0 zip.
✨ Move the extension from popup to Chrome side panel

  • Toolbar icon now opens a sidebar (sidePanel API, Chrome 114+) that


stays open while browsing; src/popup.* renamed to src/panel.*

  • The panel follows the active tab via tabs.onActivated/onUpdated and


clears the previous page's fill report on site change

  • Page access is a per-site optional host permission requested on the


first autofill there (no activeTab grant exists in a sidebar)

  • Fluid panel width instead of the fixed 340px popup. Bumps to 1.2.0

✨ Promote the Chrome extension on the site

  • /extension page with features, install steps (load unpacked for


now), and a download of the packaged zip

  • script/package-extension --publish copies the zip to public/

  • My Packages page links to the extension so makers discover it

✨ Add copy panel to the extension popup
Every package field gets a copy button (plus Copy all), so the
extension is useful on directories without an autofill mapping —
the panel auto-expands on unmapped sites and stays collapsed where
autofill works. CANONICAL_FIELDS mirrors DEFAULT_LABELS and the sync
test now enforces the field list and labels too. Bumps to 1.1.0.
šŸ”§ Prepare extension for the Chrome Web Store

  • script/package-extension builds a store-ready zip (manifest, icons,


src only) with optional MAJOR.MINOR.PATCH version bump

  • /privacy gains a Chrome-extension section for the store listing's


privacy policy URL
āš”ļø Cache directory host lookup
Directory.find_by_host resolves a host through a cached host -> id map
keyed on maximum(:updated_at) + count, replacing the per-request scan
that loaded and URI-parsed every active directory in the API lookup.
āœ… Enforce resolver.js / PackageFieldResolver sync
Runs a fully-populated project through PackageSerializer + the
extension's resolver.js (via node) and through PackageFieldResolver,
asserting every canonical field resolves identically and that no key
falls through to null in the extension. Skips when node is absent.
✨ Improve extension autofill feedback

  • Warn when values exceed a directory's character limits (max/over_by,


mirroring PackageFieldResolver#rows_for)

  • List required-but-empty package fields and prompt for a missing


contact email after filling

  • Distinguish an unreachable API from an unmapped directory

  • Try each comma-separated candidate when matching <select> options

  • Cache package/lookup responses in storage.session (5 min TTL);


explicit Load bypasses the cache, 404 lookups are never cached

  • Escape API-sourced strings before rendering them in the popup

about 1 month ago
šŸ’š Pin Docker build to Ruby 3.4.7
The deploy got past setup-ruby but failed inside the image build with the
same error: parallel 2.1.0 requires Ruby >= 3.3, but the build ran on
3.2.3.
Two places still pinned the old version. config/deploy.yml is the
decisive one, since kamal passes RUBY_VERSION as a build arg that
overrides the Dockerfile default, so fixing the Dockerfile alone would
not have changed the build.
Both now match .ruby-version (3.4.7), as the comment above the ARG
already asked for.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HCxJUTQkwwSCMoJpmuiZep