diff --git a/landing/README.md b/landing/README.md new file mode 100644 index 0000000..7b57923 --- /dev/null +++ b/landing/README.md @@ -0,0 +1,72 @@ +# MusicTools — Landing page + +Sito vetrina + checkout per MusicTools, deployato su Cloudflare Pages al dominio `musictools.djluza.com`. + +## Struttura + +``` +landing/ + index.html # landing principale + css/style.css # tema dark coerente con l'app + js/main.js # FAQ accordion, animazioni scroll, hook Lemon Squeezy + assets/ # favicon, immagini eventuali + legal/ + terms.html # termini di servizio + privacy.html # informativa privacy GDPR + refund.html # politica rimborsi + _headers # security + cache (Cloudflare Pages syntax) + _redirects # redirect rules +``` + +Nessun build step. Tutto e' HTML/CSS/JS statico servito così com'è. + +## Anteprima locale + +```bash +cd landing +python3 -m http.server 8080 +# apri http://localhost:8080 +``` + +Su `file://` Lemon Squeezy overlay non funziona — ma il sito si vede tutto. + +## Deploy su Cloudflare Pages + +**Una volta sola:** + +1. Vai su → **Workers & Pages** → **Create application** → **Pages** → **Connect to Git**. +2. Scegli il repo `luzadev/musicdownload`. +3. Configura: + - **Production branch**: `main` + - **Build command**: *(lascia vuoto)* + - **Build output directory**: `landing` + - **Root directory**: *(lascia vuoto)* +4. Salva. La build parte automatica — l'URL iniziale sara' `.pages.dev`. +5. Una volta verde, vai su **Custom domains** → **Set up a custom domain** → digita `musictools.djluza.com` → conferma. +6. Cloudflare crea automaticamente il CNAME se il dominio e' gia su Cloudflare DNS. + +Ogni `git push origin main` rilancia la build di Pages — push-to-deploy gratis. + +## Routing /api/* vs landing + +Il Worker di `server/` deve essere associato alla route `musictools.djluza.com/api/*` (vedi `server/README.md`). +Pages serve tutto il resto. Verifica nel dashboard: + +- **Workers & Pages** → `musictools-api` → **Settings** → **Triggers**: + - Aggiungi route `musictools.djluza.com/api/*` +- **Pages** → `musictools-landing` (o nome che scegli) → **Custom domains**: + - `musictools.djluza.com` + +Cloudflare applica prima la regola del Worker (path-specific) e poi quella di Pages (catch-all). + +## Da fare prima del lancio + +- [ ] Sostituisci `REPLACE_WITH_LS_PRODUCT_URL` in `index.html` con l'URL prodotto Lemon Squeezy +- [ ] Crea immagine OG 1200x630 e referenziarla nei meta `og:image` +- [ ] Aggiungi screenshot reali (sostituiscono il mockup CSS nell'hero se preferisci) +- [ ] Verifica i tre documenti legali con un consulente fiscale se vendi in regime di forfettario / partita IVA italiana +- [ ] Aggiungi Google Search Console (verification meta) per indicizzazione + +## Analytics + +Puoi aggiungere Cloudflare Web Analytics (gratuito, no cookie) dal dashboard Pages → Analytics. Si attiva con un click — niente codice da incollare. diff --git a/landing/_headers b/landing/_headers new file mode 100644 index 0000000..9c7f921 --- /dev/null +++ b/landing/_headers @@ -0,0 +1,17 @@ +# Sicurezza + cache base. +# Sintassi Cloudflare Pages: https://developers.cloudflare.com/pages/configuration/headers/ + +/* + Strict-Transport-Security: max-age=31536000; includeSubDomains + X-Content-Type-Options: nosniff + Referrer-Policy: strict-origin-when-cross-origin + Permissions-Policy: interest-cohort=() + +/css/* + Cache-Control: public, max-age=31536000, immutable + +/js/* + Cache-Control: public, max-age=31536000, immutable + +/assets/* + Cache-Control: public, max-age=2592000 diff --git a/landing/_redirects b/landing/_redirects new file mode 100644 index 0000000..2b70e98 --- /dev/null +++ b/landing/_redirects @@ -0,0 +1,7 @@ +# Redirects (sintassi Cloudflare Pages, Netlify-style). +# Niente regola per /api/* qui: lo gestisce il Worker (route definita +# nel dashboard Cloudflare). Pages serve il resto. + +# Quando implementeremo /api/download (stream firmato R2->client), abilitare: +# /download/macos /api/download/macos 302 +# /download/windows /api/download/windows 302 diff --git a/landing/assets/favicon.svg b/landing/assets/favicon.svg new file mode 100644 index 0000000..5f2d317 --- /dev/null +++ b/landing/assets/favicon.svg @@ -0,0 +1,10 @@ + + + + + + + + + ♫ + diff --git a/landing/css/style.css b/landing/css/style.css new file mode 100644 index 0000000..871e3d6 --- /dev/null +++ b/landing/css/style.css @@ -0,0 +1,716 @@ +/* ============================================================ + MusicTools — Landing page + Palette coerente con l'app: tema scuro Spotify-like. + ============================================================ */ + +:root { + --bg: #0a0a0a; + --bg-2: #060606; + --bg-card: #161616; + --bg-card-2: #1e1e1e; + --border: #262626; + --divider: #1f1f1f; + --text: #ffffff; + --text-muted: #a3a3a3; + --text-dim: #707070; + --accent: #1db954; + --accent-dark: #137a37; + --accent-glow: rgba(29, 185, 84, 0.35); + + --pink: #f472b6; + --blue: #60a5fa; + --amber: #fbbf24; + --red: #f87171; + --purple: #a78bfa; +} + +* { box-sizing: border-box; } +*::before, *::after { box-sizing: border-box; } + +html { scroll-behavior: smooth; } + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif; + font-size: 16px; + line-height: 1.55; + color: var(--text); + background: var(--bg); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +img, svg { max-width: 100%; display: block; } + +a { color: inherit; text-decoration: none; } + +.container { + max-width: 1180px; + margin: 0 auto; + padding: 0 24px; +} + +/* ============================================================ + NAV + ============================================================ */ +.nav { + position: sticky; + top: 0; + z-index: 100; + background: rgba(10, 10, 10, 0.82); + backdrop-filter: saturate(180%) blur(14px); + -webkit-backdrop-filter: saturate(180%) blur(14px); + border-bottom: 1px solid var(--border); +} + +.nav-row { + display: flex; + align-items: center; + justify-content: space-between; + height: 64px; + gap: 24px; +} + +.brand { + display: flex; + align-items: center; + gap: 10px; + font-weight: 800; + font-size: 17px; +} + +.brand-logo { + width: 32px; + height: 32px; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 9px; + background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%); + color: #fff; + font-size: 16px; +} + +.nav-links { + display: flex; + gap: 26px; + font-size: 14.5px; + color: var(--text-muted); +} +.nav-links a:hover { color: var(--text); } + +/* ============================================================ + BUTTONS + ============================================================ */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + font-family: inherit; + font-weight: 700; + border: none; + border-radius: 999px; + cursor: pointer; + padding: 12px 22px; + font-size: 14px; + transition: transform 0.15s ease, box-shadow 0.2s ease, background 0.2s ease; + white-space: nowrap; +} + +.btn:active { transform: scale(0.98); } + +.btn-primary { + background: var(--accent); + color: #0a0a0a; + box-shadow: 0 8px 24px var(--accent-glow); +} +.btn-primary:hover { background: #25d365; } + +.btn-ghost { + background: transparent; + color: var(--text); + border: 1px solid var(--border); +} +.btn-ghost:hover { background: var(--bg-card); border-color: #3a3a3a; } + +.btn-sm { padding: 8px 16px; font-size: 13px; } +.btn-lg { padding: 16px 32px; font-size: 16px; } +.btn-block { width: 100%; } + +/* ============================================================ + HERO + ============================================================ */ +.hero { + position: relative; + padding: 80px 0 100px; + overflow: hidden; + background: + radial-gradient(ellipse 60% 50% at 0% 0%, rgba(29, 185, 84, 0.18), transparent 60%), + radial-gradient(ellipse 60% 50% at 100% 100%, rgba(96, 165, 250, 0.12), transparent 60%), + linear-gradient(180deg, var(--bg) 0%, var(--bg-2) 100%); +} + +.hero-grid { + display: grid; + grid-template-columns: 1.05fr 1fr; + gap: 60px; + align-items: center; +} + +.eyebrow { + display: inline-block; + font-size: 11.5px; + font-weight: 800; + letter-spacing: 1.5px; + text-transform: uppercase; + color: var(--accent); + padding: 5px 11px; + border: 1px solid rgba(29, 185, 84, 0.35); + border-radius: 999px; + background: rgba(29, 185, 84, 0.08); +} +.eyebrow.center { + display: block; + width: max-content; + margin: 0 auto; +} + +.hero h1 { + margin: 18px 0 18px; + font-size: clamp(36px, 5.2vw, 58px); + font-weight: 900; + line-height: 1.04; + letter-spacing: -0.02em; +} +.accent { color: var(--accent); } + +.lead { + font-size: 17px; + color: var(--text-muted); + line-height: 1.6; + max-width: 520px; + margin: 0 0 28px; +} + +.hero-cta { + display: flex; + gap: 12px; + margin-bottom: 24px; + flex-wrap: wrap; +} + +.hero-bullets { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-wrap: wrap; + gap: 8px 24px; + font-size: 13.5px; + color: var(--text-muted); +} +.hero-bullets li { display: flex; align-items: center; gap: 6px; } + +/* ============================================================ + HERO MOCKUP + ============================================================ */ +.hero-art { + position: relative; + perspective: 1200px; +} + +.mockup { + width: 100%; + max-width: 560px; + margin-left: auto; + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 14px; + overflow: hidden; + box-shadow: 0 40px 100px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(255, 255, 255, 0.02); + transform: rotate3d(0, 1, 0, -6deg) translateY(0); + transition: transform 0.4s ease; +} +.mockup:hover { transform: rotate3d(0, 1, 0, -3deg); } + +.mockup-bar { + display: flex; + align-items: center; + gap: 6px; + padding: 11px 14px; + background: #111111; + border-bottom: 1px solid var(--border); + position: relative; +} +.dot { width: 11px; height: 11px; border-radius: 50%; } +.dot.red { background: #ff5f57; } +.dot.yellow { background: #febc2e; } +.dot.green { background: #28c840; } +.mockup-title { + position: absolute; + left: 50%; + transform: translateX(-50%); + font-size: 12px; + color: var(--text-dim); +} + +.mockup-body { + display: grid; + grid-template-columns: 168px 1fr; + min-height: 380px; +} + +.mockup-side { + background: #111; + border-right: 1px solid var(--border); + padding: 16px 12px; +} + +.ms-brand { + display: flex; + align-items: center; + gap: 8px; + font-size: 13px; + font-weight: 700; + margin-bottom: 18px; + padding: 0 6px; +} +.ms-brand span { + width: 22px; height: 22px; border-radius: 7px; + display: inline-flex; align-items: center; justify-content: center; + background: linear-gradient(135deg, var(--accent), var(--accent-dark)); + color: #fff; font-size: 12px; +} + +.ms-nav { display: flex; flex-direction: column; gap: 2px; } +.ms-item { + display: flex; align-items: center; gap: 10px; + padding: 7px 9px; border-radius: 8px; + font-size: 12.5px; color: var(--text-muted); +} +.ms-item.active { background: rgba(29, 185, 84, 0.14); color: #fff; } +.ms-item span { width: 18px; text-align: center; font-size: 13px; } + +.mockup-main { padding: 16px; display: flex; flex-direction: column; gap: 12px; } + +.mockup-hero { + position: relative; + padding: 18px 20px; + border-radius: 12px; + background: linear-gradient(135deg, #1db954 0%, #0e7a35 100%); + color: #fff; + overflow: hidden; +} +.mh-eyebrow { font-size: 9.5px; letter-spacing: 1.5px; font-weight: 800; opacity: 0.85; } +.mh-title { font-size: 17px; font-weight: 800; margin-top: 4px; } +.mh-sub { font-size: 11px; opacity: 0.85; margin-top: 3px; } +.mh-deco { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); font-size: 36px; opacity: 0.3; } + +.mockup-card { + background: var(--bg-card-2); + border: 1px solid var(--border); + border-radius: 11px; + padding: 12px 14px; +} +.mc-label { font-size: 9.5px; letter-spacing: 0.8px; color: var(--text-dim); text-transform: uppercase; font-weight: 700; } +.mc-input { + margin-top: 6px; + padding: 8px 10px; + background: #0d0d0d; + border: 1px solid var(--border); + border-radius: 999px; + font-size: 11.5px; + color: var(--text-muted); + font-family: ui-monospace, SFMono-Regular, monospace; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.mockup-actions { display: flex; flex-direction: column; gap: 10px; } +.mc-btn.primary { + background: var(--accent); + color: #0a0a0a; + font-size: 12px; + font-weight: 700; + padding: 9px 0; + border-radius: 999px; + text-align: center; +} +.mc-progress { + height: 6px; + border-radius: 999px; + background: #0d0d0d; + overflow: hidden; +} +.mc-progress-fill { + height: 100%; + background: linear-gradient(90deg, var(--accent), #25d365); + border-radius: inherit; + animation: progress-pulse 2.5s ease-in-out infinite alternate; +} + +@keyframes progress-pulse { + 0% { width: 40%; } + 100% { width: 78%; } +} + +/* ============================================================ + SECTIONS + ============================================================ */ +.section { + padding: 100px 0; + position: relative; +} + +.section-title { + font-size: clamp(28px, 3.8vw, 42px); + font-weight: 900; + letter-spacing: -0.02em; + text-align: center; + margin: 14px 0 12px; +} + +.section-lead { + text-align: center; + color: var(--text-muted); + font-size: 16px; + max-width: 620px; + margin: 0 auto 48px; +} + +/* ============================================================ + FEATURES + ============================================================ */ +.features { background: var(--bg-2); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); } + +.feat-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 16px; +} + +.feat { + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 16px; + padding: 24px 22px; + transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.25s ease; +} +.feat:hover { + transform: translateY(-4px); + border-color: #383838; + box-shadow: 0 18px 40px rgba(0, 0, 0, 0.4); +} + +.feat-icon { + width: 44px; + height: 44px; + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + margin-bottom: 14px; +} +.feat.green .feat-icon { background: rgba(29, 185, 84, 0.16); color: var(--accent); } +.feat.pink .feat-icon { background: rgba(244, 114, 182, 0.16); color: var(--pink); } +.feat.blue .feat-icon { background: rgba(96, 165, 250, 0.16); color: var(--blue); } +.feat.amber .feat-icon { background: rgba(251, 191, 36, 0.16); color: var(--amber); } +.feat.red .feat-icon { background: rgba(248, 113, 113, 0.16); color: var(--red); } +.feat.purple .feat-icon { background: rgba(167, 139, 250, 0.16); color: var(--purple); } + +.feat h3 { + font-size: 17px; + font-weight: 800; + margin: 0 0 6px; +} + +.feat p { + font-size: 14px; + color: var(--text-muted); + margin: 0; + line-height: 1.55; +} + +/* ============================================================ + HOW IT WORKS + ============================================================ */ +.how-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 20px; + margin-top: 12px; +} + +.how-step { + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 16px; + padding: 28px; + text-align: center; +} + +.how-num { + width: 44px; + height: 44px; + border-radius: 14px; + background: linear-gradient(135deg, var(--accent), var(--accent-dark)); + color: #fff; + font-weight: 900; + font-size: 18px; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto 16px; + box-shadow: 0 10px 24px var(--accent-glow); +} + +.how-step h3 { + font-size: 17px; + margin: 0 0 6px; + font-weight: 800; +} +.how-step p { + color: var(--text-muted); + font-size: 14px; + margin: 0; +} + +/* ============================================================ + PRICING + ============================================================ */ +.pricing { background: var(--bg-2); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); } + +.price-card { + max-width: 480px; + margin: 0 auto; + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 22px; + padding: 36px 32px 32px; + position: relative; + text-align: center; + box-shadow: 0 30px 80px rgba(29, 185, 84, 0.12); +} + +.price-badge { + position: absolute; + top: -14px; + left: 50%; + transform: translateX(-50%); + background: var(--accent); + color: #0a0a0a; + font-size: 11px; + letter-spacing: 1px; + font-weight: 800; + padding: 6px 12px; + border-radius: 999px; + text-transform: uppercase; +} + +.price-name { + font-size: 13px; + letter-spacing: 1.5px; + text-transform: uppercase; + color: var(--text-muted); + font-weight: 700; +} + +.price-row { + display: flex; + align-items: baseline; + justify-content: center; + gap: 6px; + margin: 14px 0 24px; +} +.price-amount { + font-size: 64px; + font-weight: 900; + line-height: 1; + letter-spacing: -0.03em; +} +.price-currency { font-size: 26px; font-weight: 700; color: var(--text-muted); } +.price-once { font-size: 14px; color: var(--text-muted); margin-left: 8px; } + +.price-features { + list-style: none; + padding: 0; + margin: 0 0 28px; + text-align: left; +} +.price-features li { + padding: 9px 0; + border-bottom: 1px dashed var(--divider); + font-size: 14.5px; + color: var(--text-muted); +} +.price-features li:last-child { border-bottom: none; } +.price-features strong { color: var(--text); font-weight: 700; } + +.price-note { + font-size: 12px; + color: var(--text-dim); + margin: 14px 0 0; +} + +/* ============================================================ + FAQ + ============================================================ */ +.faq-list { + max-width: 760px; + margin: 0 auto; +} + +.faq-item { + border: 1px solid var(--border); + background: var(--bg-card); + border-radius: 14px; + margin-bottom: 10px; + overflow: hidden; +} + +.faq-item summary { + list-style: none; + cursor: pointer; + padding: 18px 22px; + font-weight: 700; + font-size: 15.5px; + position: relative; + padding-right: 50px; + transition: background 0.18s ease; +} +.faq-item summary::-webkit-details-marker { display: none; } +.faq-item summary::after { + content: "+"; + position: absolute; + right: 22px; + top: 50%; + transform: translateY(-50%); + font-size: 22px; + color: var(--accent); + font-weight: 400; + transition: transform 0.25s ease; +} +.faq-item[open] summary::after { content: "−"; } +.faq-item summary:hover { background: var(--bg-card-2); } + +.faq-item p { + margin: 0; + padding: 0 22px 18px; + color: var(--text-muted); + font-size: 14.5px; + line-height: 1.6; +} +.faq-item code { + background: var(--bg-card-2); + padding: 2px 7px; + border-radius: 5px; + font-size: 13px; + font-family: ui-monospace, SFMono-Regular, monospace; + color: var(--accent); +} + +/* ============================================================ + FINAL CTA + ============================================================ */ +.cta-final { padding: 60px 0 90px; } + +.cta-box { + text-align: center; + background: + radial-gradient(ellipse at center, rgba(29, 185, 84, 0.2), transparent 70%), + linear-gradient(135deg, var(--bg-card) 0%, var(--bg-card-2) 100%); + border: 1px solid var(--border); + border-radius: 22px; + padding: 56px 28px; + max-width: 880px; + margin: 0 auto; +} +.cta-box h2 { font-size: clamp(24px, 3.2vw, 34px); font-weight: 900; margin: 0 0 8px; letter-spacing: -0.02em; } +.cta-box p { color: var(--text-muted); margin: 0 0 22px; font-size: 16px; } + +/* ============================================================ + FOOTER + ============================================================ */ +.footer { + background: var(--bg-2); + border-top: 1px solid var(--border); + padding: 36px 0 30px; + font-size: 13.5px; + color: var(--text-muted); +} + +.footer-row { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 18px; + margin-bottom: 14px; +} + +.footer-brand { + display: flex; + align-items: center; + gap: 10px; + font-weight: 700; + color: var(--text); +} +.footer-by { color: var(--text-dim); font-weight: 400; } + +.footer-links { display: flex; gap: 22px; } +.footer-links a:hover { color: var(--text); } + +.footer-copy { + font-size: 12px; + color: var(--text-dim); + border-top: 1px solid var(--divider); + padding-top: 16px; +} + +/* ============================================================ + RESPONSIVE + ============================================================ */ +@media (max-width: 920px) { + .hero { padding: 60px 0 70px; } + .hero-grid { grid-template-columns: 1fr; gap: 40px; } + .hero-art { display: none; } /* su mobile nascondiamo il mockup */ + .nav-links { display: none; } + + .section { padding: 70px 0; } + + .how-grid { grid-template-columns: 1fr; } + .footer-row { flex-direction: column; align-items: flex-start; } +} + +@media (max-width: 480px) { + .container { padding: 0 18px; } + .hero-cta .btn { width: 100%; } + .price-amount { font-size: 52px; } +} + +/* ============================================================ + ANIMAZIONI SCROLL + ============================================================ */ +.nav.scrolled { box-shadow: 0 1px 0 var(--border), 0 8px 24px rgba(0,0,0,0.4); } + +.feat, .how-step, .price-card, .faq-item { + opacity: 0; + transform: translateY(16px); + transition: opacity 0.5s ease, transform 0.5s cubic-bezier(0.2, 0.8, 0.2, 1); +} +.feat.in-view, .how-step.in-view, .price-card.in-view, .faq-item.in-view { + opacity: 1; + transform: translateY(0); +} + +@media (prefers-reduced-motion: reduce) { + .feat, .how-step, .price-card, .faq-item { + opacity: 1; transform: none; transition: none; + } + .mockup { transform: none !important; } + .mc-progress-fill { animation: none !important; width: 64% !important; } + html { scroll-behavior: auto; } +} diff --git a/landing/index.html b/landing/index.html new file mode 100644 index 0000000..5656aea --- /dev/null +++ b/landing/index.html @@ -0,0 +1,296 @@ + + + + + + MusicTools — Scarica, modifica e registra la tua musica + + + + + + + + + + + + + + + + +
+
+
+ Per Mac e Windows · Licenza a vita +

La tua musica, ovunque la trovi.
In un'unica app.

+

+ Scarica brani da Spotify, YouTube, SoundCloud e altri 1000 siti in MP3 320K. + Registra in alta qualità l'audio che esce dal tuo computer. + Modifica i metadati e le copertine. Tutto offline, senza account. +

+ +
    +
  • ✓ Acquisto una tantum, nessun abbonamento
  • +
  • ✓ Aggiornamenti gratuiti a vita
  • +
  • ✓ Funziona offline · Su 3 dispositivi
  • +
+
+ + +
+
+ + +
+
+ FUNZIONI +

Sette strumenti, un'unica app

+

Tutto quello che ti serve per gestire la tua musica, senza saltare tra siti web e tool diversi.

+ +
+
+
⬇
+

Scarica

+

Brani singoli, playlist Spotify, link YouTube, tracklist su file. Detect automatico, MP3 320K con copertina.

+
+
+
🎬
+

Video

+

YouTube, TikTok, Instagram, Facebook. Scegli la qualità (fino a 4K) o estrai solo l'audio in MP3.

+
+
+
⚡
+

Upgrade

+

Scansiona una cartella, trova i file a bitrate basso e li riscarica in alta qualità. Mantiene metadati e cover.

+
+
+
🏷
+

Metadati

+

Editor completo per MP3, M4A, FLAC, WAV. Cambia copertina, artista, album, BPM, key. Anche `kMDItemWhereFroms` su macOS.

+
+
+
●
+

Registra

+

Cattura l'audio di qualunque app (Spotify, Apple Music, browser) via BlackHole o scheda interna. Output MP3 320K.

+
+
+
📖
+

Guida integrata

+

Manuale completo dentro l'app: setup, troubleshooting, esempi. Niente schede del browser da cercare.

+
+
+
+
+ + +
+
+ COME FUNZIONA +

Tre passi, due minuti

+ +
+
+
1
+

Compra la licenza

+

Checkout sicuro tramite Lemon Squeezy. Ricevi la chiave via email entro pochi secondi.

+
+
+
2
+

Scarica l'app

+

Mac o Windows, link diretto nella stessa email. Installazione standard, niente dipendenze.

+
+
+
3
+

Attiva e parti

+

Inserisci email e chiave all'avvio. L'app si attiva e resta valida a vita su questo dispositivo.

+
+
+
+
+ + +
+
+ PREZZO +

Una licenza. Per sempre.

+

Niente abbonamenti. Niente sorprese. Compri una volta, la usi per sempre.

+ +
+
Più popolare
+
MusicTools Personal
+
+ 39,90 + € + una tantum +
+
    +
  • ✓ Licenza a vita — paghi una volta, mai più
  • +
  • ✓ 3 dispositivi — Mac e Windows mixati
  • +
  • ✓ Aggiornamenti gratuiti per tutte le versioni future
  • +
  • ✓ Tutte le 7 tab sbloccate
  • +
  • ✓ Supporto via email a info@djluza.com
  • +
  • ✓ Garanzia 14 giorni soddisfatti o rimborsati
  • +
+ + Acquista ora — 39,90 € + +

Pagamento sicuro · Carta, PayPal, Apple Pay · Fattura inclusa

+
+
+
+ + +
+
+ DOMANDE FREQUENTI +

Tutto quello che devi sapere

+ +
+
+ Su quali sistemi operativi funziona? +

macOS 11 (Big Sur) o successivi, e Windows 10/11. L'app non gira su Linux per ora.

+
+ +
+ Su quanti dispositivi posso installarla? +

Una licenza copre fino a 3 dispositivi, anche misti (Mac + Windows). Se ne cambi uno, puoi disattivare dall'app stessa o scriverci e ne liberiamo uno.

+
+ +
+ Come funzionano gli aggiornamenti? +

Sono gratis a vita. L'app controlla in automatico le nuove versioni dal menu Impostazioni → Aggiornamenti. Un click per scaricare e installare.

+
+ +
+ Devo creare un account Spotify Premium o YouTube Premium? +

No. Per Spotify ti basta un account gratuito (serve solo per ottenere le credenziali API dal loro dashboard, è gratis). YouTube non richiede account.

+
+ +
+ Posso registrare l'audio di Spotify mentre suona? +

Sì, con BlackHole (macOS) o la scheda audio virtuale di Windows. La tab Registra ti guida nel setup passo-passo.

+
+ +
+ L'app si installa senza problemi su Mac? +

Al primo avvio macOS chiede una conferma di sicurezza. Tasto destro sull'app → Apri → Apri. Lo fai una volta sola, poi parte normalmente. Nel DMG trovi anche uno script Fix Gatekeeper.command che lo fa per te.

+
+ +
+ E su Windows? +

Al primo avvio Windows SmartScreen mostra "Windows protected your PC". Clicca su More info → Run anyway. È una procedura standard per app non firmate con cert EV.

+
+ +
+ Posso chiedere il rimborso se non mi piace? +

Sì, hai 14 giorni per chiederlo senza fornire motivazioni. Scrivi a info@djluza.com.

+
+ +
+ Posso usare i brani scaricati commercialmente? +

No. MusicTools è uno strumento per uso personale. I contenuti scaricati restano soggetti al copyright dei rispettivi proprietari — sei tu responsabile di rispettare i loro termini d'uso.

+
+ +
+ Quali metodi di pagamento sono accettati? +

Tramite Lemon Squeezy: carta di credito/debito, PayPal, Apple Pay, Google Pay. Riceverai una fattura per il pagamento.

+
+
+
+
+ + +
+
+

Pronto a semplificarti la vita?

+

Una sola app per tutto quello che fai con la musica.

+ Compra ora — 39,90 € +
+
+ + + + + + + + diff --git a/landing/js/main.js b/landing/js/main.js new file mode 100644 index 0000000..30ef662 --- /dev/null +++ b/landing/js/main.js @@ -0,0 +1,54 @@ +/* ====================================================== + MusicTools landing — JS minimale + ====================================================== */ + +// Anno corrente in footer +(function setYear() { + const el = document.getElementById("year"); + if (el) el.textContent = String(new Date().getFullYear()); +})(); + +// Lemon Squeezy overlay +// Lo script di Lemon (lemon.js) intercetta automaticamente i link con +// data-lemonsqueezy-url e apre l'overlay. Qui ci limitiamo a impedire +// che il click navighi via se l'URL non e' ancora stato configurato. +document.querySelectorAll("[data-lemonsqueezy-url]").forEach((el) => { + el.addEventListener("click", (e) => { + const url = el.getAttribute("data-lemonsqueezy-url"); + if (!url || url === "REPLACE_WITH_LS_PRODUCT_URL") { + e.preventDefault(); + alert( + "Il prodotto Lemon Squeezy non e' ancora configurato.\n" + + "Crea il prodotto su Lemon Squeezy e incolla l'URL dentro " + + "landing/index.html in data-lemonsqueezy-url." + ); + } + // Se la pagina e' aperta via file:// lemon.js non riesce a inizializzare: + // in quel caso lasciamo che il link navighi via. + }); +}); + +// Header che diventa piu' opaco mentre scorri (effetto subtle) +const nav = document.querySelector(".nav"); +function onScroll() { + if (!nav) return; + if (window.scrollY > 24) nav.classList.add("scrolled"); + else nav.classList.remove("scrolled"); +} +window.addEventListener("scroll", onScroll, { passive: true }); +onScroll(); + +// Reveal on scroll: aggiunge la classe .in-view alle sezioni +// quando entrano in viewport. Niente librerie esterne. +const io = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + entry.target.classList.add("in-view"); + io.unobserve(entry.target); + } + }); +}, { threshold: 0.12 }); + +document.querySelectorAll(".feat, .how-step, .price-card, .faq-item").forEach((el) => { + io.observe(el); +}); diff --git a/landing/legal/privacy.html b/landing/legal/privacy.html new file mode 100644 index 0000000..e4a3457 --- /dev/null +++ b/landing/legal/privacy.html @@ -0,0 +1,64 @@ + + + + + + Privacy · MusicTools + + + + + + +
+

Informativa Privacy

+

Ultimo aggiornamento: 8 giugno 2026

+ +

1. Titolare del trattamento

+

Luciano Santoleri — email info@djluza.com.

+ +

2. Dati trattati

+
    +
  • Email: associata all'acquisto. Usata per inviare la chiave di licenza, comunicazioni di servizio e supporto.
  • +
  • Chiave di licenza, device_id, nome dispositivo, versione app: salvati nel database licenze per gestire le attivazioni (max 3 dispositivi) e impedire abusi.
  • +
  • Dati di pagamento: gestiti esclusivamente da Lemon Squeezy Inc. L'Editore non vede ne' conserva i dati della carta.
  • +
+ +

3. Finalita' e base giuridica

+
    +
  • Esecuzione del contratto (consegna della licenza, supporto, aggiornamenti) — art. 6(1)(b) GDPR.
  • +
  • Adempimenti fiscali e contabili — art. 6(1)(c) GDPR.
  • +
  • Sicurezza del software (verifica anti-abuso delle attivazioni) — interesse legittimo, art. 6(1)(f) GDPR.
  • +
+ +

4. Conservazione

+

I dati di licenza vengono conservati per tutta la durata del prodotto e fino a 5 anni dopo la disattivazione, per adempimenti fiscali. I log tecnici (revalidate) sono conservati per 30 giorni.

+ +

5. Terze parti

+
    +
  • Lemon Squeezy Inc. — Merchant of Record, processore di pagamento.
  • +
  • Cloudflare Inc. — hosting infrastruttura backend (Workers, D1, R2, Pages).
  • +
  • Resend Inc. — invio email transazionali.
  • +
+

Tutte queste aziende rispettano standard internazionali di protezione dati e operano con clausole contrattuali standard ove richiesto.

+ +

6. Diritti dell'interessato

+

L'utente ha diritto di accedere, rettificare, cancellare i propri dati e di ottenere portabilita' o limitazione del trattamento. Per esercitare questi diritti scrivi a info@djluza.com.

+ +

7. Cookie

+

Questo sito non usa cookie di tracciamento. Lemon Squeezy puo' impostare i propri cookie funzionali durante il checkout secondo la sua informativa.

+ +

8. Reclami

+

In caso di violazioni puoi rivolgerti al Garante per la protezione dei dati personali (garanteprivacy.it).

+
+ + diff --git a/landing/legal/refund.html b/landing/legal/refund.html new file mode 100644 index 0000000..3fd9f09 --- /dev/null +++ b/landing/legal/refund.html @@ -0,0 +1,43 @@ + + + + + + Politica rimborsi · MusicTools + + + + + + +
+

Politica rimborsi

+

Ultimo aggiornamento: 8 giugno 2026

+ +

Garanzia 14 giorni

+

Hai 14 giorni di tempo dall'acquisto per chiedere il rimborso completo, senza fornire motivazioni. La richiesta si effettua scrivendo a info@djluza.com dall'email usata per l'acquisto.

+ +

Cosa succede dopo

+
    +
  1. Riceverai una risposta entro 48 ore lavorative.
  2. +
  3. Il rimborso viene processato da Lemon Squeezy sullo stesso metodo di pagamento usato per l'acquisto. Tempi tipici: 5-10 giorni lavorativi.
  4. +
  5. La tua chiave di licenza viene revocata. L'app smette di funzionare al successivo controllo online.
  6. +
+ +

Limitazioni

+

Trascorsi 14 giorni dall'acquisto non e' piu' possibile chiedere il rimborso, salvo nei casi di malfunzionamento grave del software non risolvibile entro 30 giorni dalla segnalazione.

+ +

Domande?

+

Scrivici a info@djluza.com: siamo persone vere, rispondiamo entro un giorno lavorativo.

+
+ + diff --git a/landing/legal/terms.html b/landing/legal/terms.html new file mode 100644 index 0000000..aa74f87 --- /dev/null +++ b/landing/legal/terms.html @@ -0,0 +1,55 @@ + + + + + + Termini di servizio · MusicTools + + + + + + +
+

Termini di servizio

+

Ultimo aggiornamento: 8 giugno 2026

+ +

1. Identificazione

+

MusicTools e' un software desktop sviluppato e distribuito da Luciano Santoleri (in seguito "Editore"), email info@djluza.com.

+ +

2. Licenza d'uso

+

L'acquisto di una licenza MusicTools concede all'utente il diritto personale e non trasferibile di installare e usare il software su un massimo di 3 dispositivi controllati dall'utente. La licenza e' a vita: non scade ne' richiede pagamenti ricorrenti.

+

E' vietato distribuire, rivendere, decompilare o modificare il codice del software al di fuori di quanto consentito dalla legge.

+ +

3. Uso del software

+

MusicTools e' uno strumento di automazione che usa librerie open-source di terze parti (yt-dlp, ffmpeg, mutagen). L'Editore non fornisce ne' ospita contenuti audio/video. L'utente e' l'unico responsabile dei contenuti scaricati o registrati e del rispetto dei termini d'uso delle piattaforme di origine e delle leggi sul copyright.

+ +

4. Pagamenti e fatturazione

+

I pagamenti sono gestiti da Lemon Squeezy Inc., che opera come Merchant of Record. Lemon Squeezy emette la fattura/ricevuta fiscale e gestisce l'IVA secondo la giurisdizione del cliente.

+ +

5. Diritto di recesso

+

L'utente ha diritto di recedere entro 14 giorni dall'acquisto richiedendo il rimborso a info@djluza.com. Il rimborso viene eseguito sullo stesso metodo di pagamento usato per l'acquisto. Dopo il rimborso la licenza viene revocata e l'app non potra' piu' essere attivata.

+ +

6. Aggiornamenti

+

L'Editore si impegna a fornire aggiornamenti gratuiti per tutta la vita del prodotto. Non e' garantito un calendario specifico di rilascio.

+ +

7. Limitazione di responsabilita'

+

Il software e' fornito "cosi' com'e'". L'Editore non e' responsabile per perdite di dati, danni indiretti o consequenziali derivanti dall'uso del software, salvo nei casi previsti come inderogabili dalla legge applicabile.

+ +

8. Modifiche ai termini

+

L'Editore puo' aggiornare questi termini in qualsiasi momento. La versione corrente e' sempre disponibile a questa URL. Per modifiche sostanziali sara' inviata una notifica via email agli utenti registrati.

+ +

9. Foro competente

+

Per qualunque controversia il foro competente e' Italia, ove non diversamente previsto da norme inderogabili in materia di consumatori.

+
+ +