feat: free credits on 5 years of keploy cta button inclusion#396
Open
amaan-bhati wants to merge 57 commits into
Open
feat: free credits on 5 years of keploy cta button inclusion#396amaan-bhati wants to merge 57 commits into
amaan-bhati wants to merge 57 commits into
Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
dhananjay6561
self-requested a review
June 22, 2026 07:00
dhananjay6561
left a comment
Member
There was a problem hiding this comment.
@amaan-bhati LGTM upto now!
Replaces the external CTA link with a modal form that collects name, work email, company, and designation before redirecting. Includes ESC-to-close, backdrop-click-to-close, scroll-lock, focus-trap on first field, and a world-class UI that inherits the warm amber/gold aesthetic of the inline banner. Backend wiring is intentionally deferred — form onSubmit closes the modal for now. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
On form submit the modal now transitions to a confirmation view: - Animated SVG checkmark (circle + tick drawn via stroke-dashoffset) - "You're all set!" heading with 24-hour turnaround copy - 3-second animated progress bar countdown - Live "Redirecting in Xs..." text that ticks down - Auto-closes and opens app.keploy.io/signin in a new tab after 3s - Backdrop click disabled during confirmation to prevent accidental dismissal Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…oy.io Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
… repo Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
dhananjay6561
self-requested a review
June 27, 2026 05:38
dhananjay6561
requested changes
Jun 27, 2026
dhananjay6561
left a comment
Member
There was a problem hiding this comment.
Code Review
Reviewed all changed files. There are 4 blockers, 7 high-severity issues, and several medium/minor ones documented as inline comments below. The PR must not be merged in its current state.
Blockers:
mongodbadded to package.json contradicts the PR description (no MongoDB connection) — either it is dead code or the PR is misrepresenting what it doeswindow.opencalled afterawait fetchwill be blocked by popup blockers on virtually all modern browsers- Modal has no focus trap, no
role="dialog", noaria-modal— screen reader and keyboard accessibility regression - "Full Name" field is visually marked required but has no
requiredattribute
…non-promo posts Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
…cessibility Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Merged GatedReport feature (new files: GatedReport.tsx, gated-reports.ts) from main into this branch. Resolved post-body.tsx conflict by layering gated report injection on top of the existing InlinePromoCard applyPromos function — both features now work independently through a shared processHtmlPart entry point. Also carries over perf optimisations: parsedParts/renderedContent useMemo split, tooltipConfigs useMemo, functional setState in handleCopyClick. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…f failure Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
Signed-off-by: amaan-bhati <amaanbhati49@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds an inline "5 Years of Keploy" promo banner to high-intent blog posts. The banner opens a lead capture modal that submits directly to the Keploy telemetry server. No Next.js API route, no MongoDB connection from the blog.
What this does
Inline banner + lead modal
https://telemetry.keploy.io/blog-mqlreCAPTCHA
<Script strategy="afterInteractive">scoped to the banner component only, not globallyNEXT_PUBLIC_RECAPTCHA_SITE_KEYis not set, the banner does not render at all (fail-closed). On production the key is set in Woodpecker secrets"submit_lead", never on page loadSlug wiring
New slugs are configured in
config/inline-promos.ts. Four CTAs are active across three pages on this branch:software-testing-basicsapi-testing-strategiessoftware-testing-strategiessoftware-testing-strategiesHow i decided where to place the cta buttons:
CTA buttons are placed based on research and anlytics, I've collated the reasoning and science behind each cta placement in a doc, that is for the Keploy team internally(you can only see this if you are a part of keploy, use keploy email to open the doc): https://docs.google.com/document/d/1rxk0ATlDR5zoNiGSMW0I8a7SFxE3-ttD4kIRDFDxOiY/edit?usp=sharing
Multi-promo injection
post-body.tsxwas updated from a single-match boolean flag to a recursiveapplyPromos()function. It supports multiple CTAs per page and correctly handles cases where injection points are separated by code blocks (<pre>tags).A few screenshots:
Files changed
components/InlinePromoCard.tsx- new component: banner, modal, form, recaptcha, submit logiccomponents/InlinePromoCard.module.css- deleted (badge suppression rule removed; selector cannot reach the badge injected by Google at document body level)components/post-body.tsx- updated injection logic to support multiple promos per slugconfig/inline-promos.ts- slug config andgetInlinePromosForSluglookup functionvercel.json- CSPconnect-srcupdated to includehttps://telemetry.keploy.io,https://www.google.comandhttps://www.gstatic.com.gitignore- added.claude/settings.local.jsonHow to add more slugs
config/inline-promos.tswith theblogSlug, anafterTextsnippet from the post body, andpromoId: "keploy-5years"Environment variables
NEXT_PUBLIC_RECAPTCHA_SITE_KEYis already set in Woodpecker secrets and injected at build time.RECAPTCHA_SECRET_KEYis set on the telemetry server. No changes needed.