← All migration guides
Easy 30-60 minutes

Migrate from LaunchDarkly

Move your feature flags from LaunchDarkly to ShipSilently. Same concepts, simpler pricing, and zero latency flag evaluation at the edge.

Overview

LaunchDarkly and ShipSilently share almost identical concepts — flags, environments, and context-based targeting rules — making migration straightforward. This guide walks you through replacing the LaunchDarkly SDK and recreating your flags so your application behavior stays identical on day one.

Before you begin

  • You have an existing LaunchDarkly project with feature flags in production
  • You have a ShipSilently account (create one free)
  • Your application uses the LaunchDarkly Node.js, JavaScript, or browser SDK

Step 1: Set up your ShipSilently project

  1. Sign in to your ShipSilently account (or create one free).
  2. Create a new project from the dashboard.
  3. ShipSilently creates a production and development environment automatically.
  4. Copy your API key from Settings → API Keys.

Step 2: Recreate your flags

In the ShipSilently dashboard, create each flag from LaunchDarkly. Use the exact same flag keys to avoid a large code find-and-replace.

Tip: LaunchDarkly flag keys map 1:1 to ShipSilently flag keys. Keeping them identical means your variation() calls need only a method rename — not a key rewrite.

For each flag:

  1. Go to Feature Flags → New Flag
  2. Set the key to match your LaunchDarkly key exactly
  3. Configure targeting rules that mirror your LaunchDarkly setup

Step 3: Replace the SDK

Remove the LaunchDarkly SDK and install ShipSilently:

# Remove LaunchDarkly
npm uninstall @launchdarkly/node-server-sdk

# Install ShipSilently
npm install @shipsilently/node

Step 4: Update initialization

Before (LaunchDarkly):

import LaunchDarkly from '@launchdarkly/node-server-sdk';

const ldClient = LaunchDarkly.init(process.env.LAUNCHDARKLY_SDK_KEY);
await ldClient.waitForInitialization();

After (ShipSilently):

import { initialize } from '@shipsilently/node';

export const flags = initialize(process.env.SHIPSILENTLY_KEY);

ShipSilently evaluates flags in-memory after the initial fetch — no waitForInitialization() needed.

Step 5: Update flag evaluations

Before (LaunchDarkly):

const showNewDashboard = await ldClient.variation(
  'new-dashboard',
  { key: user.id, email: user.email, plan: user.plan },
  false
);

After (ShipSilently):

const showNewDashboard = await flags.getFlag('new-dashboard', {
  userId: user.id,
  email: user.email,
  plan: user.plan,
});

API comparison

LaunchDarklyShipSilently
ldClient.variation(key, user, default)flags.getFlag(key, context)
User object requires key fieldContext is a plain object — any fields
Default value passed inlineReturns false when flag is off
ldClient.close() on shutdownNo cleanup required
allFlagsState(user)flags.getAllFlags(context)

Step 6: Set your environment variable

Replace LAUNCHDARKLY_SDK_KEY with SHIPSILENTLY_KEY in your environment configuration:

# Remove
LAUNCHDARKLY_SDK_KEY=sdk-xxxx

# Add
SHIPSILENTLY_KEY=ss-live-xxxx

Update your CI/CD secrets, .env files, and any cloud provider configuration (Vercel, Railway, Fly.io, etc.).

Step 7: Verify in staging

Before cutting over production:

  1. Deploy to your staging environment with the ShipSilently key
  2. Confirm flags evaluate correctly for a few test users
  3. Check your ShipSilently dashboard — you should see evaluation events appear under Analytics

Step 8: Cut over production

Once staging is verified:

  1. Set SHIPSILENTLY_KEY in your production environment
  2. Deploy your updated application
  3. Monitor the ShipSilently Audit Log and Analytics to confirm flag evaluations are flowing
  4. After 24-48 hours of clean operation, remove LAUNCHDARKLY_SDK_KEY and cancel your LaunchDarkly subscription

What’s next

Ready to start your migration?

Create a free ShipSilently account and have your first flag live in minutes.