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
- Sign in to your ShipSilently account (or create one free).
- Create a new project from the dashboard.
- ShipSilently creates a
productionanddevelopmentenvironment automatically. - 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:
- Go to Feature Flags → New Flag
- Set the key to match your LaunchDarkly key exactly
- 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
| LaunchDarkly | ShipSilently |
|---|---|
ldClient.variation(key, user, default) | flags.getFlag(key, context) |
User object requires key field | Context is a plain object — any fields |
| Default value passed inline | Returns false when flag is off |
ldClient.close() on shutdown | No 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:
- Deploy to your staging environment with the ShipSilently key
- Confirm flags evaluate correctly for a few test users
- Check your ShipSilently dashboard — you should see evaluation events appear under Analytics
Step 8: Cut over production
Once staging is verified:
- Set
SHIPSILENTLY_KEYin your production environment - Deploy your updated application
- Monitor the ShipSilently Audit Log and Analytics to confirm flag evaluations are flowing
- After 24-48 hours of clean operation, remove
LAUNCHDARKLY_SDK_KEYand cancel your LaunchDarkly subscription
What’s next
- Read the ShipSilently SDK docs
- Set up percentage rollouts and A/B targeting in the dashboard
- Invite your team members in Settings → Team
Ready to start your migration?
Create a free ShipSilently account and have your first flag live in minutes.