DEV Community

Vigilmon
Vigilmon

Posted on • Originally published at vigilmon.online

How to Monitor Your Remix Application with Vigilmon

Remix (now React Router v7) is a full-stack web framework that runs on the server and the client. Its server-side rendering, data loading, and form handling happen in loaders and actions — which means your app health depends on both your Remix server and any backend services your loaders call.

This guide covers how to monitor a Remix application end-to-end with Vigilmon.

Remix Monitoring Fundamentals

Remix apps can be deployed in multiple ways:

  • Node.js server (Express adapter, Fastify adapter)
  • Cloudflare Workers (edge)
  • Vercel / Netlify (serverless functions)
  • Fly.io (containerized Node.js)

Each deployment has different failure modes, but the monitoring strategy is similar.

Step 1: Monitor Your App Root URL

Start with the simplest check — is your Remix app serving HTML?

Monitor: GET https://yourapp.com
Type: HTTP(S)
Expected status: 200
Keyword check: your app name or a unique string from your HTML
Check interval: 1 minute
Enter fullscreen mode Exit fullscreen mode

Enable multi-region monitoring. Remix apps on Cloudflare Workers run across many edge locations — verifying from multiple regions catches partial outages.

Step 2: Create a Dedicated Health Route

Add a health route that checks your critical dependencies:

// app/routes/health.tsx (or health.ts for API-only)
import { json } from '@remix-run/node';

export async function loader() {
  const checks: Record<string, string> = {};

  // Check database
  try {
    await db.execute('SELECT 1');
    checks.database = 'ok';
  } catch {
    checks.database = 'error';
  }

  // Check external API
  try {
    const response = await fetch('https://api.example.com/ping', {
      signal: AbortSignal.timeout(3000),
    });
    checks.externalApi = response.ok ? 'ok' : 'degraded';
  } catch {
    checks.externalApi = 'error';
  }

  const allOk = Object.values(checks).every(v => v === 'ok');

  return json(
    { status: allOk ? 'ok' : 'degraded', checks },
    { status: allOk ? 200 : 503 }
  );
}
Enter fullscreen mode Exit fullscreen mode

Monitor this route:

Monitor: GET https://yourapp.com/health
Expected status: 200
Keyword check: "status":"ok"
Enter fullscreen mode Exit fullscreen mode

Step 3: Monitor Your Remix Loader Dependencies

Remix loaders call external services. If those services go down, your pages throw errors:

// app/routes/dashboard.tsx
export async function loader() {
  // If this fails, Remix returns 500
  const data = await fetchDashboardData();
  return json(data);
}
Enter fullscreen mode Exit fullscreen mode

For critical routes, add a lighter-weight monitoring endpoint that tests the data pipeline:

// app/routes/api.canary.tsx
export async function loader() {
  try {
    await fetchDashboardData({ limit: 1 }); // Minimal query
    return json({ status: 'ok' });
  } catch (error) {
    return json({ status: 'error', message: error.message }, { status: 503 });
  }
}
Enter fullscreen mode Exit fullscreen mode
Monitor: GET https://yourapp.com/api/canary
Expected status: 200
Keyword check: "ok"
Enter fullscreen mode Exit fullscreen mode

Step 4: Monitor Session and Auth Flows

If your Remix app uses session-based auth, monitor that the login route is accessible:

Monitor: GET https://yourapp.com/login
Expected status: 200
Keyword check: "Sign in" or "Log in"
Enter fullscreen mode Exit fullscreen mode

For apps using OAuth (Auth0, Clerk, etc.), monitor the callback route:

Monitor: GET https://yourapp.com/auth/callback
Expected status: 302 or 400 (redirect without code is fine; 500 is not)
Enter fullscreen mode Exit fullscreen mode

Step 5: Monitor Cloudflare Workers Deployment (if applicable)

Remix on Cloudflare Workers has unique failure modes:

  • Worker size limits (1MB compressed)
  • Worker CPU time limits (10-50ms per request)
  • Durable Objects connectivity

Monitor from multiple regions to catch edge-specific issues:

Monitor: GET https://yourapp.com/health
Regions: US East, US West, EU, APAC
Expected status: 200
Response time warning: 500ms (edge should be fast)
Enter fullscreen mode Exit fullscreen mode

Step 6: Heartbeat Monitoring for Background Jobs

If your Remix app runs background processing (Inngest, Trigger.dev, custom cron), add heartbeat monitoring:

In your background job:

async function dailyReport() {
  await generateAndSendReport();

  // Ping Vigilmon on success
  await fetch('https://hb.vigilmon.online/YOUR_HEARTBEAT_ID');
}
Enter fullscreen mode Exit fullscreen mode

Configure in Vigilmon:

  • Grace period: 25 hours (allows for 1-hour drift in daily jobs)
  • Alert: immediate on miss

Step 7: SSL Certificate Monitoring

Remix apps almost always run on HTTPS. Add SSL monitoring:

Monitor: SSL certificate for yourapp.com
Warning: 30 days before expiry
Critical: 14 days before expiry
Enter fullscreen mode Exit fullscreen mode

Automated SSL renewal via Let's Encrypt can fail silently. SSL monitoring ensures you find out 30 days before expiry rather than the morning your certificate expires.

Recommended Remix Monitor Set

Monitor URL Check
App root GET / 200 + keyword
Health endpoint GET /health 200 + JSON status
Data canary GET /api/canary 200 + "ok"
Login page GET /login 200 + keyword
SSL certificate SSL check 30/14 day warning
Background jobs Heartbeat Per job schedule

Start Monitoring in 5 Minutes

Vigilmon requires no agent installation and no server changes. Add your Remix app URLs, configure your alert channels, and you're done.

Monitor your Remix app for free

Top comments (0)