@@ -715,12 +715,14 @@ const CP = (() => {
715715 function renderWizardServiceCard ( svc ) {
716716 const isSelected = wizardState . selectedServices . includes ( svc . slug ) ;
717717 const isDeployed = svc . deployed ;
718+ const isManual = svc . manual_only ;
718719 const workerNodes = _wizardWorkerSlugs [ svc . slug ] || 0 ;
719720 const totalNodes = ( isDeployed ? 1 : 0 ) + workerNodes ;
720721
721722 const classes = [ 'service-card' ] ;
722723 if ( isSelected ) classes . push ( 'selected' ) ;
723724 if ( isDeployed ) classes . push ( 'deployed' ) ;
725+ if ( isManual ) classes . push ( 'manual-only' ) ;
724726
725727 const earning = svc . earnings
726728 ? `$${ svc . earnings . monthly_low } -$${ svc . earnings . monthly_high } /${ svc . earnings . per || 'mo' } `
@@ -732,6 +734,13 @@ const CP = (() => {
732734 deployedBadge = `<span class="deployed-badge"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><polyline points="20 6 9 17 4 12"/></svg> ${ label } </span>` ;
733735 }
734736
737+ // Platform notice for manual-only services
738+ let manualNotice = '' ;
739+ if ( isManual ) {
740+ const platforms = ( svc . platforms || [ ] ) . map ( p => p . charAt ( 0 ) . toUpperCase ( ) + p . slice ( 1 ) ) . join ( '/' ) ;
741+ manualNotice = `<div class="manual-notice">${ platforms || 'Desktop' } only — earnings tracking available</div>` ;
742+ }
743+
735744 return `
736745 <div class="${ classes . join ( ' ' ) } " data-slug="${ svc . slug } " onclick="CP.toggleWizardService('${ svc . slug } ', this)">
737746 <div class="service-card-header">
@@ -742,6 +751,7 @@ const CP = (() => {
742751 </div>
743752 </div>
744753 <div class="service-desc">${ escapeHtml ( svc . short_description || '' ) } </div>
754+ ${ manualNotice }
745755 <div class="service-meta" style="margin-top: 8px;">
746756 <span class="badge badge-available">${ earning } </span>
747757 ${ svc . requirements && svc . requirements . residential_ip ? '<span class="badge badge-residential">Residential IP</span>' : '' }
@@ -777,6 +787,34 @@ const CP = (() => {
777787 }
778788
779789 function renderServiceSetupForm ( svc ) {
790+ const signupUrl = svc . referral && svc . referral . signup_url
791+ ? svc . referral . signup_url . replace ( '{code}' , svc . referral . code || '' )
792+ : svc . website || '#' ;
793+
794+ // Manual-only services: show signup link + earnings tracking notice
795+ if ( svc . manual_only ) {
796+ const platforms = ( svc . platforms || [ ] ) . map ( p => p . charAt ( 0 ) . toUpperCase ( ) + p . slice ( 1 ) ) . join ( ', ' ) ;
797+ return `
798+ <div class="card" style="margin-bottom: 16px;" id="setup-${ svc . slug } ">
799+ <div class="card-header">
800+ <h3 class="section-title">${ escapeHtml ( svc . name ) } </h3>
801+ <span class="badge badge-category">${ escapeHtml ( svc . category ) } </span>
802+ </div>
803+ <div style="padding: 8px 0;">
804+ <p style="color: var(--warning, #f59e0b); margin-bottom: 12px;">
805+ <strong>${ platforms || 'Desktop' } only</strong> — no Docker image available for automated deployment.
806+ </p>
807+ <p style="color: var(--text-secondary); margin-bottom: 16px;">
808+ Install the app on your device, then CashPilot will track your earnings automatically.
809+ </p>
810+ <a href="${ escapeHtml ( signupUrl ) } " target="_blank" rel="noopener" class="btn btn-primary btn-sm">
811+ Sign Up for ${ escapeHtml ( svc . name ) }
812+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
813+ </a>
814+ </div>
815+ </div>` ;
816+ }
817+
780818 const envFields = ( svc . docker && svc . docker . env || [ ] ) . map ( env => {
781819 const inputType = env . secret ? 'password' : 'text' ;
782820 return `
@@ -791,10 +829,6 @@ const CP = (() => {
791829 </div>` ;
792830 } ) . join ( '' ) ;
793831
794- const signupUrl = svc . referral && svc . referral . signup_url
795- ? svc . referral . signup_url . replace ( '{code}' , svc . referral . code || '' )
796- : svc . website || '#' ;
797-
798832 return `
799833 <div class="card" style="margin-bottom: 16px;" id="setup-${ svc . slug } ">
800834 <div class="card-header">
0 commit comments