> ## Documentation Index
> Fetch the complete documentation index at: https://eyerhythm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# EyeRhythm

> Privacy-focused blink tracking to detect fatigue before you feel it

export const EmailSignupForm = () => {
  const [email, setEmail] = useState('');
  const [name, setName] = useState('');
  const [status, setStatus] = useState('idle');
  const [message, setMessage] = useState('');
  const handleSubmit = async e => {
    e.preventDefault();
    if (!email) {
      setStatus('error');
      setMessage('Please enter your email address');
      return;
    }
    setStatus('loading');
    setMessage('');
    try {
      const response = await fetch('https://eyeryhthm.vercel.app/api/mailerlite/subscribe', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          email,
          name
        })
      });
      const result = await response.json();
      if (response.ok) {
        setStatus('success');
        setMessage('Thanks for subscribing! We\'ll keep you updated.');
        setEmail('');
        setName('');
      } else {
        setStatus('error');
        setMessage(result.error || 'Something went wrong. Please try again.');
      }
    } catch (error) {
      setStatus('error');
      setMessage('Network error. Please check your connection and try again.');
    }
  };
  if (status === 'success') {
    return <div style={{
      padding: '24px',
      borderRadius: '12px',
      backgroundColor: '#dcfce7',
      border: '1px solid #86efac',
      textAlign: 'center'
    }}>
        <div style={{
      fontSize: '24px',
      marginBottom: '8px'
    }}>✓</div>
        <p style={{
      margin: 0,
      color: '#166534',
      fontWeight: 500
    }}>
          {message}
        </p>
      </div>;
  }
  return <form onSubmit={handleSubmit} style={{
    display: 'flex',
    flexDirection: 'column',
    gap: '16px'
  }}>
      <div>
        <label htmlFor="signup-name" style={{
    display: 'block',
    marginBottom: '6px',
    fontWeight: 500,
    fontSize: '14px'
  }}>
          Name (optional)
        </label>
        <input id="signup-name" type="text" value={name} onChange={e => setName(e.target.value)} placeholder="Your name" style={{
    width: '100%',
    padding: '12px 16px',
    borderRadius: '8px',
    border: '1px solid #e5e7eb',
    fontSize: '16px',
    boxSizing: 'border-box'
  }} />
      </div>
      <div>
        <label htmlFor="signup-email" style={{
    display: 'block',
    marginBottom: '6px',
    fontWeight: 500,
    fontSize: '14px'
  }}>
          Email address *
        </label>
        <input id="signup-email" type="email" value={email} onChange={e => setEmail(e.target.value)} placeholder="you@example.com" required style={{
    width: '100%',
    padding: '12px 16px',
    borderRadius: '8px',
    border: '1px solid #e5e7eb',
    fontSize: '16px',
    boxSizing: 'border-box'
  }} />
      </div>
      {status === 'error' && <div style={{
    padding: '12px 16px',
    borderRadius: '8px',
    backgroundColor: '#fef2f2',
    border: '1px solid #fecaca',
    color: '#dc2626',
    fontSize: '14px'
  }}>
          {message}
        </div>}
      <button type="submit" disabled={status === 'loading'} style={{
    padding: '12px 24px',
    borderRadius: '8px',
    backgroundColor: status === 'loading' ? '#9ca3af' : '#3E63DD',
    color: '#fff',
    border: 'none',
    fontSize: '16px',
    fontWeight: 600,
    cursor: status === 'loading' ? 'not-allowed' : 'pointer',
    transition: 'background-color 0.2s'
  }}>
        {status === 'loading' ? 'Subscribing...' : 'Subscribe to newsletter'}
      </button>
      <p style={{
    margin: 0,
    fontSize: '12px',
    color: '#6b7280',
    textAlign: 'left'
  }}>
        We respect your privacy. Unsubscribe anytime.
      </p>
    </form>;
};

# Track your blinks. Detect fatigue before you feel it.

EyeRhythm monitors your blink patterns in real-time to help you stay aware of eye strain and digital fatigue. All processing happens on your device - your video never leaves your computer.

<Card title="Download EyeRhythm" icon="download" href="/download">
  Free for macOS, Windows, and Linux
</Card>

***

## How it works

<Steps>
  <Step title="Calibrate">
    A quick setup learns your natural blink patterns and sets personalized thresholds
  </Step>

  <Step title="Track">
    See your blinks per minute displayed live as you work
  </Step>

  <Step title="Get notified">
    Receive gentle reminders when your blink rate drops below healthy levels
  </Step>
</Steps>

***

## Why track blinks?

When you stare at screens, your blink rate drops by up to 70%. This leads to dry eyes, eye strain, and mental fatigue. EyeRhythm makes you aware of these patterns so you can take action before discomfort sets in.

<CardGroup cols={2}>
  <Card title="Prevent eye strain" icon="eye">
    Catch low blink rates before they cause dry eyes and discomfort
  </Card>

  <Card title="Reduce fatigue" icon="brain">
    Low blink rates signal cognitive overload - know when to take a break
  </Card>
</CardGroup>

***

## Privacy first

<Info>
  **Your video never leaves your device.** EyeRhythm processes everything locally. No recordings, no uploads, no cloud processing.
</Info>

***

## Help us improve

<Card title="Share Feedback" icon="comment" href="https://eyerhythm.userjot.com">
  Got ideas or found a bug? Your feedback shapes what we build next.
</Card>

***

## See it in action

<Frame caption="EyeRhythm tracking session in progress">
  <img src="https://mintcdn.com/eyerhythm/gQgIOH3UXzJ0EWTi/images/app-screenshot.png?fit=max&auto=format&n=gQgIOH3UXzJ0EWTi&q=85&s=4ec3b4d6fe43a0b0527295519217f607" alt="EyeRhythm app interface showing real-time blink tracking" width="1824" height="1498" data-path="images/app-screenshot.png" />
</Frame>

***

## Subscribe for updates

Get notified about new features and eye health tips.

<EmailSignupForm />
