From 6b03e5b7ebbd897cf29424871e0c2d84ba73ea67 Mon Sep 17 00:00:00 2001 From: John Mizerek Date: Sat, 21 Feb 2026 10:32:28 -0800 Subject: [PATCH] Initial Add Months WordPress theme - Dark minimal design (charcoal/slate/muted green) - Hero section with phone mockup placeholder - How It Works (3 steps) - What It Is / Isn't sections - Privacy section with pill badges - Built for Clarity section - Download section with iOS/Android beta badges - Email capture modal for beta signups - Privacy, Terms, Disclaimer page template - Beta signups stored to wp_beta_signups table - Admin panel for viewing/exporting signups Co-Authored-By: Claude Opus 4.5 --- front-page.php | 262 +++++++++++++++++++++ functions.php | 194 ++++++++++++++++ index.php | 6 + page.php | 79 +++++++ style.css | 600 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1141 insertions(+) create mode 100644 front-page.php create mode 100644 functions.php create mode 100644 index.php create mode 100644 page.php create mode 100644 style.css diff --git a/front-page.php b/front-page.php new file mode 100644 index 0000000..f49c99c --- /dev/null +++ b/front-page.php @@ -0,0 +1,262 @@ + +> + + + + + + + + +> + + +
+
+
+
+

Identify the single change most likely to extend your life.

+

Add Months analyzes your lifestyle and shows your Dominant Challenge — the factor with the greatest potential impact on your lifespan.

+
+ + How It Works +
+
+
+
+
+ + + +
App Screenshot
+
Click to join beta
+
+
+
+
+
+
+ + +
+
+
+

How It Works

+
+
+
+
1
+

Enter your baseline.

+

Age, health status, and core lifestyle factors.

+
+
+
2
+

Analyze your exposures.

+

The app models conservative lifespan impacts using established population data.

+
+
+
3
+

See your Dominant Challenge.

+

The single change with the largest potential gain — right now.

+
+
+
+
+ + +
+
+
+

Add Months is:

+
    +
  • A clarity tool.
  • +
  • Private and local.
  • +
  • Based on population-level risk modeling.
  • +
  • Designed for re-evaluation over time.
  • +
+
+
+

Add Months is not:

+
    +
  • Medical advice.
  • +
  • A habit tracker.
  • +
  • A social network.
  • +
  • A coaching app.
  • +
  • A data collection platform.
  • +
+
+
+
+ + +
+
+
+

Your data never leaves your device.

+
+ No accounts required + No analytics + No ads + Encrypted local storage + Hard delete = permanent +
+

We cannot see your inputs. We do not collect or sell behavioral data.

+
+
+
+ + +
+
+
+

Built for Clarity

+

Most health apps try to optimize everything. Add Months identifies the one lever that matters most — so you can focus your effort where it counts.

+

Re-run whenever your life changes.

+
+
+
+ + +
+
+
+

Get Early Access

+

Join the beta to be among the first to try Add Months.

+
+
+ + + +
+
Join the
+
iOS Beta
+
+
+
+ + + +
+
Join the
+
Android Beta
+
+
+
+
+
+
+ + + + + + + + + + + + diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..aac2750 --- /dev/null +++ b/functions.php @@ -0,0 +1,194 @@ +prefix . 'beta_signups'; + $charset_collate = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE IF NOT EXISTS $table_name ( + id bigint(20) NOT NULL AUTO_INCREMENT, + email varchar(255) NOT NULL, + platform varchar(20) NOT NULL, + created_at datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (id), + UNIQUE KEY email (email) + ) $charset_collate;"; + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + dbDelta($sql); +} +add_action('after_switch_theme', 'addmonths_create_signups_table'); + +// Handle beta signup AJAX +function addmonths_handle_signup() { + // Verify nonce + if (!wp_verify_nonce($_POST['nonce'], 'beta_signup_nonce')) { + wp_send_json_error('Invalid request'); + return; + } + + $email = sanitize_email($_POST['email']); + $platform = sanitize_text_field($_POST['platform']); + + if (!is_email($email)) { + wp_send_json_error('Invalid email address'); + return; + } + + if (!in_array($platform, array('ios', 'android'))) { + wp_send_json_error('Invalid platform'); + return; + } + + global $wpdb; + $table_name = $wpdb->prefix . 'beta_signups'; + + // Check if email already exists + $exists = $wpdb->get_var($wpdb->prepare( + "SELECT id FROM $table_name WHERE email = %s", + $email + )); + + if ($exists) { + wp_send_json_success('Already signed up'); + return; + } + + // Insert new signup + $result = $wpdb->insert( + $table_name, + array( + 'email' => $email, + 'platform' => $platform + ), + array('%s', '%s') + ); + + if ($result) { + wp_send_json_success('Signed up successfully'); + } else { + wp_send_json_error('Failed to sign up'); + } +} +add_action('wp_ajax_beta_signup', 'addmonths_handle_signup'); +add_action('wp_ajax_nopriv_beta_signup', 'addmonths_handle_signup'); + +// Admin page to view signups +function addmonths_admin_menu() { + add_menu_page( + 'Beta Signups', + 'Beta Signups', + 'manage_options', + 'beta-signups', + 'addmonths_signups_page', + 'dashicons-email', + 30 + ); +} +add_action('admin_menu', 'addmonths_admin_menu'); + +function addmonths_signups_page() { + global $wpdb; + $table_name = $wpdb->prefix . 'beta_signups'; + + // Handle CSV export + if (isset($_GET['export']) && $_GET['export'] === 'csv') { + $signups = $wpdb->get_results("SELECT * FROM $table_name ORDER BY created_at DESC"); + + header('Content-Type: text/csv'); + header('Content-Disposition: attachment; filename="beta-signups-' . date('Y-m-d') . '.csv"'); + + $output = fopen('php://output', 'w'); + fputcsv($output, array('Email', 'Platform', 'Signed Up')); + + foreach ($signups as $signup) { + fputcsv($output, array($signup->email, $signup->platform, $signup->created_at)); + } + + fclose($output); + exit; + } + + $signups = $wpdb->get_results("SELECT * FROM $table_name ORDER BY created_at DESC"); + $total = count($signups); + $ios_count = $wpdb->get_var("SELECT COUNT(*) FROM $table_name WHERE platform = 'ios'"); + $android_count = $wpdb->get_var("SELECT COUNT(*) FROM $table_name WHERE platform = 'android'"); + + ?> +
+

Beta Signups

+ +
+
+

Total

+

+
+
+

iOS

+

+
+
+

Android

+

+
+
+ +

Export CSV

+ + + + + + + + + + + + + + + + + + + + + + + + +
EmailPlatformSigned Up
email); ?>platform)); ?>created_at); ?>
No signups yet.
+
+ +> + + + + + + + +> + + + + + + + + diff --git a/style.css b/style.css new file mode 100644 index 0000000..4b59fa1 --- /dev/null +++ b/style.css @@ -0,0 +1,600 @@ +/* +Theme Name: Add Months +Theme URI: https://addmonths.com +Author: Payfrit +Author URI: https://payfrit.com +Description: Minimal, dark theme for Add Months app landing page +Version: 1.0.0 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Text Domain: addmonths +*/ + +:root { + --bg-primary: #0a0a0a; + --bg-secondary: #141414; + --bg-tertiary: #1a1a1a; + --text-primary: #ffffff; + --text-secondary: #a0a0a0; + --text-muted: #666666; + --accent: #4a7c59; + --accent-hover: #5a9469; + --border: #2a2a2a; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + background-color: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; + font-size: 16px; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 24px; +} + +h1, h2, h3 { + font-weight: 500; + letter-spacing: -0.02em; +} + +h1 { + font-size: clamp(2rem, 5vw, 3.5rem); + line-height: 1.1; +} + +h2 { + font-size: clamp(1.5rem, 3vw, 2.25rem); + margin-bottom: 1.5rem; +} + +h3 { + font-size: 1.25rem; + margin-bottom: 0.75rem; +} + +p { + color: var(--text-secondary); +} + +a { + color: var(--accent); + text-decoration: none; + transition: color 0.2s ease; +} + +a:hover { + color: var(--accent-hover); +} + +/* Hero Section */ +.hero { + min-height: 100vh; + display: flex; + align-items: center; + padding: 120px 0 80px; + position: relative; + background: linear-gradient(180deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); +} + +.hero-content { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 80px; + align-items: center; +} + +.hero-text h1 { + margin-bottom: 1.5rem; +} + +.hero-text .subheadline { + font-size: 1.25rem; + color: var(--text-secondary); + margin-bottom: 2.5rem; + max-width: 500px; +} + +.hero-ctas { + display: flex; + gap: 1rem; + flex-wrap: wrap; +} + +.btn { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 14px 28px; + border-radius: 8px; + font-size: 1rem; + font-weight: 500; + transition: all 0.2s ease; + cursor: pointer; + border: none; +} + +.btn-primary { + background-color: var(--text-primary); + color: var(--bg-primary); +} + +.btn-primary:hover { + background-color: #e0e0e0; + color: var(--bg-primary); +} + +.btn-secondary { + background-color: transparent; + color: var(--text-primary); + border: 1px solid var(--border); +} + +.btn-secondary:hover { + border-color: var(--text-secondary); +} + +.hero-mockup { + display: flex; + justify-content: center; +} + +.phone-mockup { + width: 280px; + height: 580px; + background: var(--bg-tertiary); + border-radius: 40px; + border: 2px solid var(--border); + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; + cursor: pointer; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.phone-mockup:hover { + transform: translateY(-4px); + box-shadow: 0 20px 40px rgba(0,0,0,0.3); +} + +.phone-mockup::before { + content: ""; + position: absolute; + top: 12px; + width: 80px; + height: 24px; + background: var(--bg-primary); + border-radius: 12px; +} + +.mockup-placeholder { + color: var(--text-muted); + font-size: 0.875rem; + text-align: center; + padding: 20px; +} + +.mockup-placeholder svg { + width: 48px; + height: 48px; + margin-bottom: 12px; + opacity: 0.5; +} + +/* How It Works */ +.how-it-works { + padding: 120px 0; + background: var(--bg-secondary); +} + +.section-header { + text-align: center; + margin-bottom: 80px; +} + +.steps { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 48px; +} + +.step { + text-align: center; + padding: 40px 24px; +} + +.step-number { + width: 48px; + height: 48px; + border: 2px solid var(--accent); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto 24px; + font-size: 1.25rem; + font-weight: 500; + color: var(--accent); +} + +.step h3 { + color: var(--text-primary); +} + +.step p { + font-size: 0.9375rem; +} + +/* What It Is */ +.what-it-is { + padding: 120px 0; +} + +.what-it-is .container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 80px; +} + +.is-list, .isnt-list { + list-style: none; +} + +.is-list li, .isnt-list li { + padding: 12px 0; + padding-left: 32px; + position: relative; + color: var(--text-secondary); +} + +.is-list li::before { + content: "✓"; + position: absolute; + left: 0; + color: var(--accent); + font-weight: bold; +} + +.isnt-list li::before { + content: "✕"; + position: absolute; + left: 0; + color: var(--text-muted); +} + +/* Privacy */ +.privacy-section { + padding: 120px 0; + background: var(--bg-secondary); +} + +.privacy-content { + max-width: 700px; + margin: 0 auto; + text-align: center; +} + +.privacy-bullets { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 16px; + margin: 40px 0; +} + +.privacy-bullet { + background: var(--bg-tertiary); + padding: 12px 24px; + border-radius: 100px; + font-size: 0.9375rem; + color: var(--text-secondary); + border: 1px solid var(--border); +} + +.privacy-statement { + font-style: italic; + color: var(--text-muted); + font-size: 0.9375rem; +} + +/* Clarity */ +.clarity { + padding: 120px 0; +} + +.clarity-content { + max-width: 700px; + margin: 0 auto; + text-align: center; +} + +.clarity-content p { + font-size: 1.125rem; + margin-bottom: 1rem; +} + +.clarity-subtle { + color: var(--text-muted); + font-size: 0.9375rem; +} + +/* Download */ +.download-section { + padding: 120px 0; + background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-primary) 100%); +} + +.download-content { + text-align: center; +} + +.app-badges { + display: flex; + justify-content: center; + gap: 24px; + margin-top: 40px; + flex-wrap: wrap; +} + +.app-badge { + background: var(--bg-tertiary); + border: 1px solid var(--border); + border-radius: 12px; + padding: 16px 32px; + display: flex; + align-items: center; + gap: 12px; + transition: all 0.2s ease; + cursor: pointer; +} + +.app-badge:hover { + border-color: var(--text-secondary); + transform: translateY(-2px); +} + +.app-badge svg { + width: 32px; + height: 32px; +} + +.app-badge-text { + text-align: left; +} + +.app-badge-small { + font-size: 0.75rem; + color: var(--text-muted); +} + +.app-badge-big { + font-size: 1.125rem; + font-weight: 500; + color: var(--text-primary); +} + +/* Footer */ +.site-footer { + padding: 40px 0; + border-top: 1px solid var(--border); +} + +.footer-content { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 24px; +} + +.footer-links { + display: flex; + gap: 32px; +} + +.footer-links a { + color: var(--text-muted); + font-size: 0.875rem; +} + +.footer-links a:hover { + color: var(--text-secondary); +} + +.footer-copyright { + color: var(--text-muted); + font-size: 0.875rem; +} + +/* Modal */ +.modal-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.8); + display: none; + align-items: center; + justify-content: center; + z-index: 1000; + padding: 24px; +} + +.modal-overlay.active { + display: flex; +} + +.modal { + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: 16px; + padding: 48px; + max-width: 480px; + width: 100%; + position: relative; +} + +.modal-close { + position: absolute; + top: 16px; + right: 16px; + background: none; + border: none; + color: var(--text-muted); + font-size: 24px; + cursor: pointer; + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; +} + +.modal-close:hover { + color: var(--text-primary); +} + +.modal h2 { + margin-bottom: 0.5rem; +} + +.modal p { + margin-bottom: 24px; +} + +.form-group { + margin-bottom: 16px; +} + +.form-group label { + display: block; + margin-bottom: 8px; + font-size: 0.875rem; + color: var(--text-secondary); +} + +.form-group input, +.form-group select { + width: 100%; + padding: 14px 16px; + background: var(--bg-tertiary); + border: 1px solid var(--border); + border-radius: 8px; + color: var(--text-primary); + font-size: 1rem; +} + +.form-group input:focus, +.form-group select:focus { + outline: none; + border-color: var(--accent); +} + +.form-group select option { + background: var(--bg-tertiary); +} + +.form-submit { + width: 100%; + margin-top: 8px; +} + +.form-success { + text-align: center; + padding: 24px 0; + display: none; +} + +.form-success.active { + display: block; +} + +.form-success svg { + width: 64px; + height: 64px; + color: var(--accent); + margin-bottom: 16px; +} + +.form-success h3 { + color: var(--text-primary); + margin-bottom: 8px; +} + +.signup-form.hidden { + display: none; +} + +/* Responsive */ +@media (max-width: 968px) { + .hero-content { + grid-template-columns: 1fr; + gap: 60px; + text-align: center; + } + + .hero-text .subheadline { + margin-left: auto; + margin-right: auto; + } + + .hero-ctas { + justify-content: center; + } + + .hero-mockup { + order: -1; + } + + .steps { + grid-template-columns: 1fr; + gap: 24px; + } + + .what-it-is .container { + grid-template-columns: 1fr; + gap: 60px; + } +} + +@media (max-width: 640px) { + .hero { + padding: 80px 0 60px; + } + + .how-it-works, + .what-it-is, + .privacy-section, + .clarity, + .download-section { + padding: 80px 0; + } + + .phone-mockup { + width: 240px; + height: 500px; + } + + .footer-content { + flex-direction: column; + text-align: center; + } + + .footer-links { + flex-wrap: wrap; + justify-content: center; + } +}